为什么我的crypto. sublite .digest的实现对相同长度的字符串产生相同的十六进制哈希值?

Why does my implementation of crypto.sublte.digest result in equivalent hex hashes for equal length strings?

本文关键字:字符串 十六进制 哈希值 crypto digest 实现 我的 为什么 sublite      更新时间:2023-09-26

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

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

相等长度的字符串不再有匹配的散列。