2015-09-23 21 views
0

我試圖將在Django應用程序中創建的一些用戶遷移到Node.js應用程序中。在Django應用程序中創建的用戶使用BCryptSHA256PasswordHasher hasher對他們的pssswords進行散列處理,並將這些存儲在PostgreSQL數據庫中。我能夠得到的Postgres整個密碼字符串,其中這些存儲形式:在Node.js中使用BCryptSHA256PasswordHasher驗證密碼在Django中散列應用程序

<algorithm>$<iterations>$<salt>$<hash>. 

我所試圖做的是找出如何利用一個已知的密碼(比如密碼1),並使用鹽從Postgres的字段中,獲取Node.js散列字符串以匹配Django字符串。通過這種方式,我可以驗證那些已經被遷移的用戶。

我已經做了幾次使用bcrypt和bcryptjs npm的Node.js的嘗試,但到目前爲止我沒有運氣。

使用任何Node.js npm的工作示例將會很棒。

+0

你是否檢查過'BCryptSHA256PasswordHasher'的源代碼來檢查確切的alghoritm? – GwynBleidD

+0

確實我看過源代碼,但是我對Python和它的庫不是很熟悉,而且問題更多的是如何在Node.js中實現相同的結果 –

回答

1

我設法弄清了這一點,經過一番公平的審判&錯誤。這是解決方案:

var crypto = require('crypto'), 
    bcrypt = require("bcrypt"); 

exports.auth = function (password) { 
    var preHash = crypto.createHash('sha256').update(password).digest('hex'); 
    var hash = bcrypt.hashSync(preHash, salt); 

    return hash; 
} 

其中鹽參數例如應當是:

$2a$12$imuoSFEBx8JJh5L9cCDJKO 

我仍然不清楚的東西是鹽字符串「$ 2A $」的第一部分。在我的Django密碼字段中,這實際上是'$ 2b $',它根據bcrypt page on Wikipedia是有效的,但當試圖在傳遞給bcrypt(以及bcryptjs)的salt中使用$ 2b $時,會引發錯誤。我可以解決這個問題,但也許bcrypt只需要更新。