2013-03-13 192 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),那对我来说就是诀窍! :)