Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 摘要返回具有不同数据的相同值_Javascript_Hash_Sha256_Webcrypto Api - Fatal编程技术网

Javascript 摘要返回具有不同数据的相同值

Javascript 摘要返回具有不同数据的相同值,javascript,hash,sha256,webcrypto-api,Javascript,Hash,Sha256,Webcrypto Api,我正在使用Javascript Forge获取一些数据的摘要,目前实验使用的是不同的文档,以下代码行始终返回相同的哈希: function obtainData() { getDocument(getHash); } function getDocument(callback) { var file = dInput.files[0]; var reader = new FileReader(); reader.onload = function(e){

我正在使用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值

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

尝试按如下方式确定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;
}

对于不同的文档或数据,所有哈希值都相同的原因是,尝试摘要的方法始终引用包含数据的对象([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;
}
函数getHash(缓冲区){ 日志(缓冲区); var crypto=window.crypto | | window.msCrypto; var-digestHash; var promise=crypto.minute.digest({name:“SHA-256”}, convertStringToArrayBufferView(缓冲区)); 承诺。然后(功能(结果){ digestHash=convertArrayBufferToHexadecimal(结果); log(digestHash); }); 返回digestHash; } 函数转换器StringToArrayBufferView(str){ var bytes=新的Uint8Array(str.length); 对于(变量i=0;i对于(i=0,len=data_view.bytellength;i不同文档或数据的所有哈希值都相同的原因是,尝试摘要的方法总是引用包含数据的对象([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;
}
函数getHash(缓冲区){ 日志(缓冲区); var crypto=window.crypto | | window.msCrypto; var-digestHash; var promise=crypto.minute.digest({name:“SHA-256”}, convertStringToArrayBufferView(缓冲区)); 承诺。然后(功能(结果){ digestHash=convertArrayBufferToHexadecimal(结果); log(digestHash); }); 返回digestHash; } 函数转换器StringToArrayBufferView(str){ var bytes=新的Uint8Array(str.length); 对于(变量i=0;i对于(i=0,len=data_view.bytellength;iForge库通常与Uint8一起工作。将内容转换为Uint8Array应该可以正常工作

reader.onload = function(e){
    var contents = e.target.result;
    var  binary = arrayBufferToString(contents);
    var array = callback(binary)
    console.log(array.digest().toHex());
}


function arrayBufferToString( buffer ) {
    var binary = '';
    var bytes = new Uint8Array( buffer );
    var len = bytes.byteLength;
    for (var i = 0; i < len; i++) {
        binary += String.fromCharCode( bytes[ i ] );
    }
    return binary;
}
reader.onload=函数(e){
var内容=e.target.result;
var binary=arrayBufferToString(内容);
var数组=回调(二进制)
log(array.digest().toHex());
}
函数arrayBufferToString(缓冲区){
var二进制=“”;
var字节=新的Uint8Array(缓冲区);
var len=字节数。字节长度;
对于(变量i=0;i
使用WebCryptographiApi也是一个很好的解决方案

函数获取数据(){
getDocument(getHash);
}
函数arrayBufferToString(缓冲区){
var二进制=“”;
var字节=新的Uint8Array(缓冲区);
var len=字节数。字节长度;
对于(变量i=0;i


hash
Forge库通常与Uint8一起使用。将内容转换为Uint8Array应该可以正常工作

reader.onload = function(e){
    var contents = e.target.result;
    var  binary = arrayBufferToString(contents);
    var array = callback(binary)
    console.log(array.digest().toHex());
}


function arrayBufferToString( buffer ) {
    var binary = '';
    var bytes = new Uint8Array( buffer );
    var len = bytes.byteLength;
    for (var i = 0; i < len; i++) {
        binary += String.fromCharCode( bytes[ i ] );
    }
    return binary;
}
reader.onload=函数(e){
var内容=e.target.result;
var binary=arrayBufferToString(内容);
var数组=回调(二进制)
log(array.digest().toHex());
}
函数arrayBufferToString(缓冲区){
var二进制=“”;
var字节=新的Uint8Array(缓冲区);
var len=字节数。字节长度;
对于(变量i=0;i
使用WebCryptographiApi也是一个很好的解决方案

函数获取数据(){
getDocument(getHash);
}
函数arrayBufferToString(缓冲区){
var二进制=“”;
var字节=新的Uint8Array(缓冲区);
var len=字节数。字节长度;
对于(变量i=0;i


hash
将'var'关键字放在函数中第一个'digestHash'之前。因为您的post-digestHash中有'var'关键字,所以hash是全局的,可能会被覆盖。我将更新我的答案以更好地突出显示它。不,仍然是同一个hash,我制作了var-digestHash,没有更改尝试放置一个console.log(buffer);作为getHash中的第一行,查看您是否实际传入了不同的文件,或者是否传入了相同的文件。除此之外,我想我已经没有主意了。抱歉。哈希始终位于对象本身,而不是包含它的数据。请在函数中的第一个“digestHash”之前放置“var”关键字。正如您在pos中所拥有的一样t digestHash是全局的,可能会被覆盖。我将更新我的答案以更好地突出显示它。不,仍然是相同的hash,我创建了var dige