【问题标题】:How calculate correctly sha256 on Javascript?如何在 Javascript 上正确计算 sha256?
【发布时间】:2020-02-09 00:18:47
【问题描述】:

我遇到了问题。我想在 javascript 上使用图像获取 sha256 哈希,但我的 sha256 不正确。

这是我的代码:

<button onclick="onSuccess()">Click me</button>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.js"></script>
<script>

    function onSuccess(imageURI) {
        var hash = CryptoJS.SHA256("imagehere");
        console.log([hash].join(''));
    }
</script>

但结果是:f3ccce7bbec0d8b3b4c6f967b2e405609b7fe691309306271bd41e22ab420aa8,好的代码应该是:bedce3a32c3c2350dbcb220ed21aca171dfe57abdf68bf9ba878c0c447214742

我做错了什么?错误在哪里?

【问题讨论】:

  • 我没有使用 Crypto-js 的经验,但从手册中我看到该函数用于散列字符串。如果目标是对图像的内容进行哈希处理,则需要首先构建包含 jpg 内容的字符串,然后对其进行哈希处理。祝你好运!

标签: javascript hash cryptography sha256 cryptojs


【解决方案1】:

我不是这方面的专家,但我发现是对另一个线程的评论让我对正在发生的事情有所了解,所以我将其发布在这里:

“真正发生的是 SHA256 返回一个 256 位哈希值。所以你打印的是那些字节,就好像它们是字符一样,它们各自的字符值都是胡言乱语。 在线工具返回给您的是该值以十六进制格式表示。 请注意,当 256 位等于 32 个字节(您可能认为是 32 个字符)时,您(使用该工具)得到 64 个字节 IE 64 个字符。这是因为要以十六进制格式表示一个完整的字节,需要 2 个字符。 4 个最高有效位占用一个字符,其他较低有效位占用另一个。”

据我了解,基本上两者都是正确的,但解析方式不同。

您可以看到here 是您发布的后一个是十六进制代码,这不是任何 sha256 哈希算法在代码中实际返回的内容。

试试this在线转换工具,你会发现它给你的和你的第一个一样(那个方法给你回报)。

最后,您应该依赖代码中返回的格式(来自函数调用),因为即使使用具有相同散列算法的其他库,它也始终是正确的。

希望对你有帮助

【讨论】:

    【解决方案2】:

    您只是得到文本C:\Users\fjolmedo... 的哈希值,您没有对具有该名称的文件的内容进行哈希处理,因为您的代码没有打开/读取其内容。也就是说,您实际上需要将文件从磁盘读取到内存中,然后对其进行哈希处理。

    由于允许任意(不受信任的)网页读取他们喜欢的任何文件的安全隐患,只有当用户使用文件 input 选择文件或将文件放到该文件上时,才会授予访问权限

    cryptojs 似乎不支持更新的 JavaScript 功能,例如 ArrayBuffer,因此您的问题需要的代码比您预期的要多,请参阅 https://stackoverflow.com/a/33918579/1358308 示例

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-24
      • 2016-01-01
      • 2011-12-12
      • 1970-01-01
      • 2014-01-14
      • 2015-12-23
      • 2016-09-04
      • 2017-08-19
      相关资源
      最近更新 更多