4

次のコードは、これら 2 つのソースから改作されました。

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
    };
}());

Chrome または Firefox コンソールで実行すると、同じ 16 進文字列を使用sha256.digest("this string").then(function (x) { console.log(x) } );して生成します。sha256.digest("that strong").then(function (x) { console.log(x) } );

実際、同じ長さの 2 つの文字列は同じ 16 進数表現になります。

私が読んだことはすべて、2 つの同等のハッシュを持つことはまれであると述べています。つまり、ここで何か間違ったことをしているということです。それが何なのか、私にはわかりません。

4

1 に答える 1

2

さて、私はついにこれを理解しました。

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

等しい長さの文字列には、一致するハッシュがなくなりました。

于 2015-07-08T20:54:33.753 に答える