【问题标题】:Hashing an Image in Javascript在 Javascript 中散列图像
【发布时间】:2013-02-18 23:01:12
【问题描述】:

我目前一直在尝试使用 javascript 从我的浏览器中对图像进行哈希处理。但是,我一直在对从 HTML 中的 canvas 元素中检索到的 dataURL 或像素数据的字符串进行散列处理。这显然与我想做的散列图像的原始数据不同。

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

有人知道我如何使用 javascript 访问这些原始图像数据以获取与我从 PHP hash_file($file) 获得的结果哈希值等效的哈希值吗?

谢谢!

【问题讨论】:

  • “图像的原始数据”不是“像素数据”吗?当然,图像数据不是文件。
  • 我要查找的原始数据是 0 和 1,因为像素数据是由 0-255 之间的数字组成的一串数字(如果我没记错的话)。我怀疑 PHP 中的函数使用的是 0 和 1,而不是连接在一起的 0-255 值。
  • “数字串”是什么意思?你有包含二进制数据的字符串还是字节数组?
  • 0-255 只是 0 和 1 的 8 倍。
  • 对,就是说代表图像的二进制数据也是由什么组成的?我的印象是文件/图像的字节与像素并不完全相关。否则字符也可能是像素的表示,我想我只是没有看到。

标签: javascript html image hash


【解决方案1】:

您可以通过对图像文件位置的 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();

之后,您可以使用任何您喜欢的散列算法。这是它们的库:https://code.google.com/p/crypto-js/

【讨论】:

  • 啊,这个响应是有目的的,但出于安全考虑,我希望一切都在客户端完成,独立于任何服务器并且只使用浏览器中的图像元素。
  • 您已经从服务器获取图像文件,对吧?这只是再次抓住它。你从哪里加载图像,你不能再次加载它?不然你可能遇到过的canvas+dataURL方案有什么问题?
  • 我是,这个问题只是增加了安全性。例如,如果我希望对这个图像进行数字签名,我依赖服务器正确发送回我的字节数据很容易受到更改(假设 http,没有 ssl)。我想签署我看到的图像,真正签署我所看到的。编辑:但是,如果这也可以根据我收到的数据在浏览器中重新加载图像,那么这实际上会起作用。
  • dataURL的问题是跨浏览器,dataURL的不一致。
  • 在我上次发表评论之后,我意识到现在您的解决方案可能是唯一正确的解决方案......我想我将不得不解决这个小的安全缺陷。
猜你喜欢
  • 2016-02-21
  • 2014-08-01
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
  • 2019-09-05
  • 1970-01-01
相关资源
最近更新 更多