2013-03-13 12 views
9

Ich portiere über eine Django-Site zu Node.js und ich versuche, die Django-Set-Passwort-Methode in Node zu implementieren. Dies ist der Django CodePython (django) hashlib vs Nodejs crypto

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) 

und hier ist der Node.js Code, den ich bisher habe:

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); 
}); 

Meine Lösung in Knoten nicht ausgibt die gleichen Ergebnisse wie der Python/Django-Code. An diesem Punkt bin ich ziemlich über meinen Kopf und jede Hilfe würde sehr geschätzt werden. Danke im Voraus.

+0

Knoten verwendet HMAC + SHA1, und soweit ich sehen kann, kann das nicht geändert werden (während mit Python können Sie 'Digest.sha1' anstelle von' Digest.sha256' verwenden, aber ich bin mir nicht sicher, ob das ist akzeptabel für Sie). – robertklep

+0

Ja, meine aktuellen Passwörter wurden mit sha256 erstellt. – imns

+0

[cryptojs] (https://github.com/gwjjeff/cryptojs) unterstützt PBKDF2 mit HMAC + SHA256, führt aber immer noch nicht zu den gleichen Ergebnissen. Ich denke Django verwendet eine eigene Implementierung, die nicht ganz Standard ist. – robertklep

Antwort

5

Hier ist eine bessere Lösung mit 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; 

Der obige Code sollte ausreichen, um Passwörter in Django gespeichert zu validieren Knoten verwenden.

1

Also meine Lösung zu diesem Zweck war ein Python-Skript zu erstellen, die das Salz und Benutzer-Passwort übernimmt und das Hash-Passwort zurückgibt. Ich rufe dieses Skript von Knoten und parse die Ergebnisse. Ich überprüfe, ob das Hash-Passwort mit: pbkdf2_sha256 beginnt, dann validiere ich es mit dem, was mein Python-Skript zurückgegeben hat. Wenn es validiert, verwende ich die Hash-Funktion meines neuen Systems, um das Passwort zurückzusetzen.

0

bababa Antwort Folgen, mein Ansatz war auch ein Python-Skript erstellen mit

"von django.contrib.auth Import hashers"

Die Funktionen hashers.check_password() und hashers.make_password() Bereitstellung der Funktionalität, die benötigt wird, um Passwörter für eine Django-Installation zu validieren oder zu erstellen.

Weitere Dokumentation zu diesen Funktionen kann auf https://docs.djangoproject.com/en/1.5/topics/auth/passwords/

1

Verwenden pbkdf2-sha256 statt finden. Hatte genau das gleiche Problem, mit dem Sie es zu tun hatten (Django -> NodeJS) und das hat den Trick für mich gemacht! :)