0

私は Javascript Forge を使用して一部のデータのダイジェストを取得しています。現在、実験はさまざまなドキュメントで行われており、次のコード行は常に同じハッシュを返します。

function obtainData() {
    getDocument(getHash);
}

function getDocument(callback) {
    var file = dInput.files[0];
    var reader = new FileReader();
    reader.onload = function(e){
        var contents = e.target.result;
        var array = callback(contents)
        console.log(array.digest().toHex());
    }
    reader.readAsArrayBuffer(file);
}

function getHash(buffer) {
    digestHash = forge.md.sha256.create();
    digestHash.update(buffer);
    //always the same with different bytes everytime
    console.log(digestHash.digest().toHex());
    return digestHash;
}

なぜこうなった?何か不足していますか?

さまざまなブラウザで試してみましたが、まだ同じ digestHash 値です

4

3 に答える 3

1

すべてのハッシュ値が異なるドキュメントまたはデータで同じである理由は、ダイジェストしようとするメソッドが常にデータを含むオブジェクト ([object Object]) を参照するため、常に同じ結果が得られるためです。そこで、これを回避するために、webcrypto を使用することにしました。

function getHash(buffer) {
    console.log(buffer);
    var crypto = window.crypto || window.msCrypto;
    var digestHash;

    var promise = crypto.subtle.digest({name:"SHA-256"},
    convertStringToArrayBufferView(buffer));

    promise.then(function (result) {
        digestHash = convertArrayBufferToHexadecimal(result);
        console.log(digestHash);
    });

    return digestHash;
}

function convertStringToArrayBufferView(str) {
    var bytes = new Uint8Array(str.length);
    for(var i = 0; i < str.length; i++){
        bytes[i] = str.charCodeAt(i);
    }
    return bytes;
}

function convertArrayBufferToHexadecimal(buffer) {
    var data_view = new DataView(buffer);
    var i, len, hex = '', c;
    for(i = 0, len = data_view.byteLength; i<len; i+=1){
        c = data_view.getUint8(i).toString(16);
        if(c.length < 2){
            c = '0' + c;
        }
        hex += c;
    }

    return hex;
}

http://qnimate.com/でこのソリューションを見つけました。WebCrypto を使用したハッシュに関するセクションがあります。

于 2016-06-17T20:00:06.227 に答える
0

次のように digestHash をスコープしてみてください。

function getHash(buffer) {
    // in your post the below line is missing 'var'
    // without the below 'var' digestHash will be global
    var digestHash = forge.md.sha256.create(); 
    digestHash.update(buffer);
    //always the same with different bytes everytime
    console.log(digestHash.digest().toHex());
    return digestHash;
}
于 2016-06-16T22:01:13.723 に答える