node.js - NodeJS : Crypto - Why do I get the same hash no matter on the input?

标签 node.js hash cryptography

我正在使用 Crypto 对带有盐的字符串进行 200 次哈希处理。我有一个奇怪的行为,哈希值总是相同的。我现在让它返回看起来正确的结果,但我想知道是否有人可以告诉我原因。

这是每次产生相同哈希值的原始代码(假设相同的盐):

const crypto = require('crypto');

console.log(hashPwd('abc', '11111111111111111111111111111111'));
console.log(hashPwd('def', '11111111111111111111111111111111'));


function hashPwd(password, hexSalt){
    var salt = hex2a(hexSalt);
    var hashPwd = crypto.createHash('sha256').update(salt + password);
    for(var x =0; x < 199; x++){
        hashPwd = crypto.createHash('sha256').update(salt + hashPwd);
    }
    return hashPwd.digest('hex');
}

//From: http://stackoverflow.com/questions/3745666/how-to-convert-from-hex-to-ascii-in-javascript
function hex2a(hexx) {
    var hex = hexx.toString();//force conversion
    var str = '';
    for (var i = 0; i < hex.length; i += 2)
        str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
    return str;
}

以上输出结果:

52cfd2b127266c1c846ded37c986d8663506118332437daa6eadbc32525c2aa4
52cfd2b127266c1c846ded37c986d8663506118332437daa6eadbc32525c2aa4

下面的代码返回预期结果:

const crypto = require('crypto');

console.log(hashPwd('abc', '11111111111111111111111111111111'));
console.log(hashPwd('def', '11111111111111111111111111111111'));

function hashPwd(password, hexSalt){
    const hasher = crypto.createHash('sha256');
    var salt = hex2a(hexSalt);
    var hashPwd = hasher.update(salt + password);
    for(var x =0; x < 199; x++){
        hashPwd = hasher.update(salt + hashPwd);
    }
    return hashPwd.digest('hex');
}

//From: http://stackoverflow.com/questions/3745666/how-to-convert-from-hex-to-ascii-in-javascript
function hex2a(hexx) {
    var hex = hexx.toString();//force conversion
    var str = '';
    for (var i = 0; i < hex.length; i += 2)
        str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
    return str;
}

产生正确的:

05525f74c0220924a2c9626ca75c2d997bf8b49a8c74208501aaf7a222d11899
c846cb3dc58163530b7b7afc7b467c104fa11566f405b333d030e5e6595bfaec

有人可以解释一下为什么吗?

最佳答案

只要看一下结果就可以看出

crypto.createHash('sha256').update('abc')+'123'

> '[object Object]123'

当您尝试将字符串添加到哈希对象时,您正在将哈希转换为字符串,从而生成此常量字符串。

如果您使用过

hashPwd = crypto.createHash('sha256').update(salt + hashPwd).digest('hex')

它会正常工作。

所以本质上你只是一遍又一遍地散列字符串salt+'[object Object]'

关于node.js - NodeJS : Crypto - Why do I get the same hash no matter on the input?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43268301/

相关文章:

ssl - 在一次握手消息中发送 `Encrypted Extension` 和 `Server Finished`。 TLS1.3 中是否强制?

javascript - 未解析的函数或方法 findOne()

nginx - Nginx 可以从一些字符串(唯一的 Request Id)中进行哈希求和吗?

node.js - Mongo降序排序

laravel 5.2 - 为用户创建密码

c - 在 C 中调整现有的 GOST 代码以散列文件

performance - 如何计算算法的加密和解密时间复杂度?

php - 在Android中解密Base64加密图像

javascript - 使用worker启动Node.js项目

sql - Nodejs 乏味 Mssql 无效状态