gpt4 book ai didi

javascript - 为什么我的 crypto.sublte.digest 实现会产生等长字符串的等价十六进制哈希值?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:15:52 28 4
gpt4 key购买 nike

以下代码改编自这两个来源:

http://qnimate.com/hashing-using-web-cryptography-api/

https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest

(function () {
"use strict";

var crypto = window.crypto || window.msCrypto;

if (typeof crypto.subtle === "undefined") {
return;
}

function convertStringToArrayBuffer (str) {
var strLength = str.length, buffer = new ArrayBuffer(strLength), i = 0;
while (i < strLength) {
buffer[i] = str.charCodeAt(i);
i += 1;
}
return buffer;
}

function convertBufferToHex (buffer) {
var data = new DataView(buffer), i = 0,
dataLength = data.byteLength, cData = null,
hexValue = '';

while (i < dataLength) {
cData = data.getUint8(i).toString(16);
if (cData.length < 2) {
cData = '0' + cData;
}

hexValue += cData;
i += 1;
}
return hexValue;
}

function digest (str) {
var buf = convertStringToArrayBuffer(str);

return crypto.subtle.digest("SHA-256", buf).then(function (hash) {
return convertBufferToHex(hash);
});
}

window.sha256 = {
"convertStringToArrayBuffer": convertStringToArrayBuffer,
"convertBufferToHex": convertBufferToHex,
"digest": digest
};
}());

使用 sha256.digest("this string").then(function (x) { console.log(x) } );sha256.digest("that strong") .then(function (x) { console.log(x) } ); 在 Chrome 或 Firefox 控制台中运行时生成相同的十六进制字符串。

事实上,任何两个长度相同的字符串都将具有相同的十六进制表示形式。

我读过的所有内容都表明很少有两个等价的哈希值。这意味着我在这里做错了什么。我不知道那是什么东西。

最佳答案

好吧,我终于明白了。

根据 MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer , 你不能直接给 ArrayBuffer 赋值。

相反,您必须使用 Uint8Array、Uint16Array、DataView 等工具来为 ArrayBuffer 赋值。

所以我改变了

function convertStringToArrayBuffer (str) {
var strLength = str.length, buffer = new ArrayBuffer(strLength), i = 0;
while (i < strLength) {
buffer[i] = str.charCodeAt(i);
i += 1;
}
return buffer;
}

function convertStringToArrayBuffer (str) {
var strLength = str.length, buffer = new Uint8Array(strLength), i = 0;
while (i < strLength) {
buffer[i] = str.charCodeAt(i);
i += 1;
}
return buffer;
}

瞧! :D

等长字符串不再有匹配的哈希值。

关于javascript - 为什么我的 crypto.sublte.digest 实现会产生等长字符串的等价十六进制哈希值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31297610/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com