2013-03-13 74 views
9

我通過Django站點移植到Node.js,我試圖在Node中重新實現Django set密碼方法。這是Django的代碼python(Django)hashlib與Nodejs加密

from django.utils.crypto import (
    pbkdf2, get_random_string) 

import hashlib 

password = 'text1' 
algorithm = "pbkdf2_sha256" 
iterations = 10000 
salt = 'p9Tkr6uqxKtf' 
digest = hashlib.sha256 
hash = pbkdf2(password, salt, iterations, digest=self.digest) 
hash = hash.encode('base64').strip() 
print "%s$%d$%s$%s" % (self.algorithm, iterations, salt, hash) 

和這裏的Node.js的代碼,我到目前爲止:

var password = 'text1'; 
var hashed = crypto.createHash('sha256').update(password, 'utf8').digest(); 
var salt = 'p9Tkr6uqxKtf'; 
var algorithm = "pbkdf2_sha256"; 
var iterations = 10000; 
crypto.pbkdf2(hashed, salt, iterations, 32, function(err, encodedPassword) { 
    var newPass = new Buffer(encodedPassword).toString('base64'); 
    console.log(encodedPassword); 

    // console.log(Buffer(encodedPassword, 'binary').toString('hex')); 
    var finalPass = algorithm +'$'+ iterations +'$'+ salt +'$'+ newPass; 
    console.log(finalPass); 
}); 

我的節點解決方案不輸出相同的結果的Python/Django的代碼。在這一點上,我幾乎在我的頭上,任何幫助將非常感激。提前致謝。

+0

節點使用HMAC + SHA1,並且據我所見,無法更改(而使用Python,您可以使用'digest.sha1'而不是'digest.sha256',但我不確定這是否您可以接受)。 – robertklep 2013-03-13 20:45:15

+0

是的,我現在的密碼是用sha256創建的。 – imns 2013-03-13 21:12:01

+0

[cryptojs](https://github.com/gwjjeff/cryptojs)支持PBKDF2與HMAC + SHA256,但它仍然不會產生相同的結果。我認爲Django使用它自己的實現不太標準。 – robertklep 2013-03-13 21:43:11

回答

5

下面是使用pbkdf2-sha256更好的解決方案:

var pbkdf2 = require('pbkdf2-sha256'); 
var password = 'text1'; 
var salt = 'p9Tkr6uqxKtf'; 
var algorithm = "pbkdf2_sha256"; 
var iterations = 10000; 
var hashed = pbkdf2(password, new Buffer(salt), iterations, 32).toString('base64'); 
var finalPass = algorithm +'$'+ iterations +'$'+ salt +'$'+ hashed; 

上述代碼應足以驗證使用節點存儲在Django密碼。

1

所以我的解決方案是創建一個python腳本,它接受鹽和用戶密碼並返回哈希密碼。我從節點調用這個腳本並解析結果。我檢查散列密碼是否以pbkdf2_sha256開頭,然後根據python腳本返回的內容對其進行驗證,如果驗證使用我的新系統散列函數重置密碼。

0

繼BABABA的回答,我的做法是創建與使用

以及 「從django.contrib.auth進口hashers」

功能hashers.check_password()和hashers.make_password一個Python腳本()提供驗證或創建Django安裝密碼所需的功能。

這個功能更多的文檔可以在https://docs.djangoproject.com/en/1.5/topics/auth/passwords/

1

使用pbkdf2-sha256,而不是被發現。如果你正在處理的是同樣的問題(Django - > NodeJS),那對我來說就是訣竅! :)