2013-07-09 10 views
7

Ho un database da Django e voglio lavorare con lui da Node.js. Ho un compito: autenticare gli utenti. Conosciuto dal database: algoritmo pbkdf2_sha256, salt, 10000 iterazioni e hash codificato in base64. Quali passi devo fare in JS per codificare alcune password per l'hash base64?Django pbkdf2_sha256 JS implementazione

UPD: ha trovato la soluzione qui: python (django) hashlib vs Nodejs crypto ma hash e hash JS-generato non corrispondere Django-generated ...
Django generare prossimo:

pbkdf2_sha256$10000$NmzpPCQiTe2R$U8ipSsOy3Xz7FwWDHdH/dTei8Xh4Q7NGtdzrCacSfvo= 

JS:

pbkdf2_sha256$10000$NmzpPCQiTe2R$w4jCgWjDilrDmcOBd8K+I8OdwpkKwoVQZMKWH3FvYcKoAMKcwqlewobDocOEGMKZfQ== 

Password: Simple123

+0

Hai provato a ottenere lo stesso numero di byte dal PBKDF? Ottenere 49 byte in cambio è un po 'strano se non hai specificato quel numero. Assicurati inoltre di utilizzare la stessa codifica dei caratteri della password in entrambe le funzioni: la codifica dei caratteri di PBKDF2 non è specificata (sebbene sia suggerito UTF-8). –

risposta

7

Utilizzando pbkdf2-sha256 (dal proprio collegamento) Sono in grado di generare un hash identico a quello che si ha da Django.

var pbkdf2 = require('pbkdf2-sha256'); 
var validatePassword = function (key, string) { 
    var parts = string.split('$'); 
    var iterations = parts[1]; 
    var salt = parts[2]; 
    return pbkdf2(key, new Buffer(salt), iterations, 32).toString('base64') === parts[3]; 
}; 
var djangoPass = 'pbkdf2_sha256$10000$NmzpPCQiTe2R$U8ipSsOy3Xz7FwWDHdH/dTei8Xh4Q7NGtdzrCacSfvo='; 
console.log(validatePassword('Simple123', djangoPass)); // Logs: true 

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

0

ho dovuto affrontare un compito simile dove devo autenticare gli utenti contro Django passwor ds in Java. Dopo aver provato senza successo a raggiungere questo obiettivo utilizzando l'hash predefinito pbkdf2_sha256 in Django, ho finito col cambiare il metodo usato per hash la password Django per poter replicare facilmente lo stesso algoritmo in Java.

Come descritto nel Django documentation è possibile modificare l'ordine in cui sono definiti nel PASSWORD_HASHERS settings.py, ho messo questo hasher in prima posizione:

'django.contrib.auth.hashers.SHA1PasswordHasher'

In questo modo l'hash della password memorizzata nel Django database è qualcosa di simile:

sha1$upSZarr0w7CZ$304b22b1a9e7e5387e79f50e691043d3faf83c48

Se si dispone già di alcune password nel database saranno convertiti automaticamente da Django un t primo accesso utente.

Si può facilmente tokenize l'hash utilizzando $ come separatore; il primo token è sempre sha1 (l'algoritmo utilizzato), il secondo token è salt e l'ultimo token è l'attuale hash.

Per abbinare una password è possibile verificare che

304b22b1a9e7e5387e79f50e691043d3faf83c48

è la somma SHA1 del sale concatenato con la password previsto:

SHA1(upSZarr0w7CZ + password) = 304b22b1a9e7e5387e79f50e691043d3faf83c48

Nel nostro caso la cauzione le implicazioni dell'uso di un algoritmo più debole per l'hashing della password erano accettabili.

+0

Per un modo Java di fare pango di Django pbkdf2_sha256: https://gist.github.com/JustinTArthur/3528cfca7e644547d6ce –

2

Ho recentemente creato un progetto per semplificare questo compito. Il mio progetto è disponibile per il nodo e si chiama node-django-hashers.Il codice è qui sotto:

https://github.com/kalvish21/hashers

Un esempio dell'uso:

var hashers = require('node-django-hashers'); 

var h = new hashers.PBKDF2PasswordHasher(); 
var hash1 = h.encode("password", h.salt()); 
console.log(h.verify("password", hash1)); // returns true 
console.log(h.verify("wrong_password", hash1)); // returns false 

Questo è compatibile con la password hashing Django.