以下代码改编自这两个来源:
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(“那么强”).然后(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
等长字符串不再具有匹配的哈希值.