2013-03-13 11 views
9

Sto eseguendo il porting su un sito Django su Node.js e sto cercando di implementare nuovamente il metodo della password di Django set in Node. Questo è il codice Djangopython (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) 

ed ecco il codice Node.js che ho finora:

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

La mia soluzione in Nodo non emette gli stessi risultati come il codice Python/Django. A questo punto sono praticamente sopra la mia testa e qualsiasi aiuto sarebbe molto apprezzato. Grazie in anticipo.

+0

Il nodo utilizza HMAC + SHA1 e, per quanto posso vedere, non può essere modificato (mentre con Python è possibile utilizzare 'digest.sha1' anziché' digest.sha256', ma non sono sicuro che sia accettabile per voi). – robertklep

+0

Sì, le mie password correnti sono state create con sha256. – imns

+0

[cryptojs] (https://github.com/gwjjeff/cryptojs) supporta PBKDF2 con HMAC + SHA256 ma non produce ancora gli stessi risultati. Penso che Django usi la sua implementazione che non è abbastanza standard. – robertklep

risposta

5

Ecco una soluzione migliore usando 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; 

Il codice di cui sopra dovrebbe essere sufficiente per convalidare le password memorizzate in Django con Node.

1

Quindi la mia soluzione a questo era di creare uno script python che prende la password salt e users e restituisce la password hash. Io chiamo questo script dal nodo e analizzo i risultati. Controllo se la password hash inizia con: pbkdf2_sha256, quindi la convalido rispetto a ciò che il mio script python ha restituito, se convalida usa la mia nuova funzione di hashing del sistema per reimpostare la password.

0

seguito la risposta di bababa, il mio approccio è stato quello di creare uno script Python, nonché utilizzando

"dal django.contrib.auth hashers importazione"

Le funzioni hashers.check_password() e hashers.make_password() fornire le funzionalità necessarie per convalidare o creare password contro l'installazione di Django.

Altro documentazione su queste funzioni sono disponibili sul https://docs.djangoproject.com/en/1.5/topics/auth/passwords/

1

Usa pbkdf2-sha256 invece. Aveva lo stesso identico problema con cui stavi lavorando (Django -> NodeJS) e questo ha fatto il trucco per me! :)