2014-09-28 69 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