在Javascript中对图像进行散列

在Javascript中对图像进行散列,javascript,html,image,hash,Javascript,Html,Image,Hash,我目前一直在尝试使用javascript从浏览器中散列图像。然而,我一直在散列从HTML中的canvas元素检索的dataURL字符串或像素数据。这显然不同于散列图像的原始数据,这是我想要做的 例如,php哈希文件函数中用于相同图像的数据 有人知道我如何使用javascript访问这些原始图像数据,以获得一个哈希值,该值将相当于我从PHP哈希_文件($file)获得的结果哈希值吗 谢谢 您可以通过对图像文件位置的XHR请求获取图像的原始数据 var xhr = new XMLHttpReques

我目前一直在尝试使用javascript从浏览器中散列图像。然而,我一直在散列从HTML中的canvas元素检索的dataURL字符串或像素数据。这显然不同于散列图像的原始数据,这是我想要做的

例如,php哈希文件函数中用于相同图像的数据

有人知道我如何使用javascript访问这些原始图像数据,以获得一个哈希值,该值将相当于我从PHP哈希_文件($file)获得的结果哈希值吗


谢谢

您可以通过对图像文件位置的XHR请求获取图像的原始数据

var xhr = new XMLHttpRequest();
xhr.open('GET', '/my/image/file.png', true);
xhr.responseType = 'arraybuffer'; // this will accept the response as an ArrayBuffer
xhr.onload = function(buffer) {
    var words = new Uint32Array(buffer),
        hex = '';
    for (var i = 0; i < words.length; i++) {
      hex += words.get(i).toString(16);  // this will convert it to a 4byte hex string
    }
    console.log(hex);
};
xhr.send();
var xhr=new-XMLHttpRequest();
open('GET','/my/image/file.png',true);
xhr.responseType='arraybuffer';//这将接受作为ArrayBuffer的响应
xhr.onload=函数(缓冲区){
var字=新的UINT32阵列(缓冲区),
十六进制='';
for(var i=0;i

之后,您可以使用任何您想要的哈希算法。这里有一个它们的库:

为什么“图像的原始数据”不是“像素数据”?当然,图像数据不是文件。我要查找的原始数据是0和1,其中像素数据是由0-255之间的数字组成的字符串(如果我没有弄错范围的话)。我怀疑PHP中的函数使用的是0和1,而不是连接在一起的0-255值。你说的“数字字符串”是什么意思?你有一个包含二进制数据的字符串还是一个字节数组?0-255只是8乘以0和1。对,这就是表示图像的二进制数据也是由什么组成的吗?我的印象是,文件/图像的字节数与像素数并不完全相关。否则,字符也可能是像素的表示形式,我想我只是没有看到而已。啊,这个响应可以达到这个目的,但出于安全目的,我希望一切都在客户端完成,独立于任何服务器,只使用浏览器中的图像元素。您已经从服务器获取了图像文件,对吗?这只是再次抓住它。您从何处加载的图像无法再次加载?否则,您可能会遇到的canvas+dataURL解决方案有什么问题?我是说,这只是增加了安全性。例如,如果我希望对该图像进行数字签名,则依赖服务器正确发送回我的字节数据容易发生更改(假设为http,无ssl)。我想签署我看到的图像,真正签署我看到的。编辑:但是,如果这也可以根据我收到的数据在浏览器中重新加载图像,那么这将实际起作用。dataURL的问题是跨浏览器,dataURL的不一致。在我上次发表评论之后,我意识到现在您的解决方案可能是唯一正确的解决方案。。。我想我必须克服这个小小的安全缺陷。