如何在 Javascript 上正确计算 sha256?



我遇到了一个问题。我想在 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

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

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

"真正发生的事情是SHA256返回一个256位的哈希值。因此,您打印的是那些字节,就好像它们是字符一样,它们各自的字符值都是胡言乱语。 在线工具返回的是十六进制格式的该值的表示形式。 请注意,当 256 位等于 32 字节(您可能认为 32 个字符(时,您(使用该工具(将获得 64 字节 IE 64 个字符。这是因为要以十六进制格式表示整个字节,需要 2 个字符。4 个最高有效位采用一个字符,其他不太重要的位采用另一个字符。

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

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

尝试这个在线转换工具,您会发现它为您提供与第一个相同的转换工具(该方法会给您回报(。

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

希望这有帮助

你只是得到文本C:Usersfjolmedo...的哈希,你没有哈希使用该名称的文件的内容,因为你的代码没有打开/读取其内容。 即您实际上需要将文件从磁盘读取到内存中,然后对其进行哈希处理。

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

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

最新更新