2014-09-28 70 views
2

我有benn在这里几个小时了,似乎无法在这里或其他任何地方找到类似的问题。在拼命寻找小的错别字或其他错误后,我转向你。rehash加密通过返回不同的结果与加密在Node.js

我第一次实现加密,到目前为止所有工作都已经成功完成,我使用加密库和Node.js一起对密码进行哈希和加密。到目前为止,这工作得很好,但是当我尝试进行迭代重新组合时,我没有得到相同的密钥。

让我告诉你我的代码:

从app.get方法:

var salt = crypto.randomBytes(128); 

    var hash = crypto.createHash('sha256'); 
    hash.update(salt.toString('base64') + request.query.password); 
    var hashedKey = hash.digest('base64'); 
    console.log("original pass is: " + hashedKey) 
    var stretchedKey = crypto.pbkdf2Sync(hashedKey, salt, 1000, 128); 

    var promise = db.User.create({ 
     username: request.query.username.toLowerCase(), 
     email: request.query.email.toLowerCase(), 
     encryptedPassword: stretchedKey.toString('base64'), 
     randomSalt: salt.toString('base64'), 
     premium: true 
    }); 

,你可以在上面我生成新用户随机盐看到,追加密码它并散列它。从那以后,我尽量伸展,然后将其保存在数据库中

这里是从认证方法的代码:

var hash = crypto.createHash('sha256'); 
    hash.update(user.randomSalt.toString('base64') + request.query.password); 
    var hashedKey = hash.digest('base64'); 
    console.log("redone pass is: " + hashedKey) 
    var stretchedKey = crypto.pbkdf2Sync(hashedKey, user.randomSalt, 1000, 128); 

    console.log("!! " + stretchedKey.toString('base64') + "\n!! " + user.encryptedPassword) 

    //protect against timing attacks 
    var check = 0; 
    for (var i = 0; i < stretchedKey.toString('base64').length; i++) 
    { 
     if (stretchedKey.toString('base64').charAt(i) !== user.encryptedPassword.charAt(i)) 
     { 
     check++; 
     } 
    } 

    if (check === 0) 
    { 
      response.json({ 
      status: 'correct pass' 
      }); 
    } 
    else 
    { 
     response.json({ 
      status: 'wrong pass' 
     }); 
    } 
    }); 

两个的console.log,它记录“hashedKey”显示了同样的结果,该结果:6lYiSRufti1MBxyMKQKTb5RBM3Ff9qZqzXasXSHPv0E=

它记录两个改头换面的密码产生这种较长的控制台日志: ts1b7SpI9Wsemk05Sx/SEYs6mbQa9dbU0qbOxP5Z5oC27yeaBi5syaQDTRDuzWkqtGeUBSNhaoCfAyXN4O9eX8ar5IBEGoGx5T4nb8PFu89XuR3/ZfvF+mbwezzfReUW7BYzqOCugB8v+7hFCmpAvG5OZ9uoDGiKh/Uh0mRXOmI=

l/2Rq3s3caek2NNQBJ9mRXBcztX0PTGy0bXksriqLX128NkPJ7j6UeeoKyRSh/Bxdfavb0V/C3LUzDSOLruQSA+Y29mEXIbhVjloVtJJGpN+ACckSlf447xlcVF29IlwJn1sN6GvRlYJuuxB8b9Q3Yz7DWaM1PcmN9+oRyeAD0E=

您能告诉我哪里可能会出错吗?

在此先感谢 彼得

+0

你从复制这个地方,还是你自己写的吗?似乎有很多奇怪的转换正在进行,例如,您将散列存储为Base64,但是当您检索该散列时,首先要做的就是在之前保存的Base64字符串上运行'toString('base64)'等?为什么你会比较当时的一个字符串? – adeneo 2014-09-28 09:09:40

+0

嗨,我阅读了一些关于如何操作的指南,但是我自己写了这些指南,我愿意接受所有关于改进的建议。 我一次比较一个角色的原因是为了确保操作总是花费相同的时间量以防止时间攻击 – Luffen 2014-09-28 09:17:31

回答

1

原因在结果中的错配是由于你的盐不一致Base64'ing。

如果代替:

var stretchedKey = crypto.pbkdf2Sync(hashedKey, salt, 1000, 128); 

你应该使用:

var stretchedKey = crypto.pbkdf2Sync(hashedKey, salt.toString('base64'), 1000, 128); 

问候

+0

甜蜜,那有效!不能相信我错过了! – Luffen 2014-09-28 19:15:49