2014-04-02 4 views
7

Ich bin tatsächlich mit bcrypt Modul Hash und vergleichen Hash-Passwörter.Node.js Passwort Hashing Bcrypt Alternative mit Crypto

Was ich tun möchte, ist das bcrypt Modul zu entfernen und verwenden Sie die Standardbibliothek crypto sowohl zum Hashing und Vergleichen von Kennwörtern.

Ist das möglich?

Wird dies weniger sicher sein als mit node-bcrypt?

Haben Sie ein Beispiel/tutorial/doc/link, wie Sie vorgehen?

oder Beispiel i wie dieses eigentlich so mache:

bcrypt.hash(string,secret_key) 
bcrypt.compare(string,string,secret_key); 

ich möchte nur diese mit Krypto replizieren, wenn möglich:

crypto.hash(string,secret_key) 
    crypto.compare(string,string,secret_key); 

Antwort

7

Sie Hash kann PBKDF2 aus der Krypto-Bibliothek:

crypto.pbkdf2(password, salt, iterations, keylen, digest, callback) 

Beispielimplementierung:

const crypto = require('crypto'); 
crypto.pbkdf2('secret', 'salt', 100000, 512, 'sha512', (err, derivedKey) => { 
    if (err) throw err; 
    console.log(derivedKey.toString('hex')); // '3745e48...aa39b34' 
}); 

hier geht die Referenz: https://nodejs.org/api/crypto.html#crypto_crypto_pbkdf2_password_salt_iterations_keylen_digest_callback

Es verwendet HMAC-Digest-Algorithmus wie sha512 einen Schlüssel gegebener Länge aus dem angegebenen Passwort, Salz und Iterationen abzuleiten. Pbkdf2 hat ähnliche Langsamkeitsmerkmale wie bcrypt. Mit PBKDF2, bcrypt oder scrypt kann der Angreifer nur einige tausend Versuche pro Sekunde (oder weniger, je nach Konfiguration) machen.

+0

excatly was ich thx viel – sbaaaang

+1

Hinweis müssen, dass Angreifer mit [oclHashcat mit GPU] (http://hashcat.net/ oclhashcat /) o.ä. können pro Sekunde viel mehr Ratespiele machen als du, es sei denn du machst die Iterationen wirklich hoch. Zum Beispiel kann ein einzelner PC mit 8x AMD R9 290Xstock Kerntakt mehr oder weniger 1,3 Millionen PBKDF2-HMAC-SHA-1 (Passwort, Salz, 8192,20) macht Tests pro Sekunde, dh 3.4E12 oder 2^41 Vermutungen aller 30 Tage. Sie müssen Ihre Iteration zählen (oder BCrypt Arbeitsfaktor), um ihren Stil mehr zu crimpen. –

+0

@ Anti-schwache Passwörter Ja, CPU und GPU-Geschwindigkeiten werden immer aktualisiert, deshalb haben Sie konfigurierbare Iterationen in pbkdf2, so dass Sie immer die Balance – Masum

3

bcrypt wird sicherer als Krypto, einfach weil es ist langsamer. hier sind ich jedoch einige Passwort-Funktionen schrieb in Coffeescript Krypto mit (I kommen Sie mit den create_password Teile mit einem '$', werden Sie, dass die Spaltung in check_password sehen):

create_password = function(passwd, method, salt) { 
    var hmac; 
    method || (method = "sha1"); 
    salt || (salt = crypto.randomBytes(6).toString('base64')); 
    hmac = crypto.createHmac(method, salt); 
    hmac.end(passwd); 
    return { 
     hash: hmac.read().toString('hex'), 
     salt: salt, 
     method: method 
    }; 
    }; 

    check_password = function(hashed, passwd) { 
    var hash, hashp, method, salt, _ref; 
    _ref = hashed.split("$"), method = _ref[0], salt = _ref[1], hashp = _ref[2]; 
    hash = create_password(passwd, method, salt).hash; 
    return hash === hashp; 
    }; 

Beispiel Nutzung:

passwd = "SOME STRING HERE" 
hash_parts = create_password(passwd) 
hashed = pwd_parts.method + "$" + pwd_parts.salt + "$" + pwd_parts.hash 
check_password(hashed, passwd) 
+0

SHA1? :) @Tim Brown – sbaaaang

+0

Ja, es war Legacy auf diese Weise gespeichert, und meine App brauchte nichts super sicher. Natürlich konfigurierbar! –

+0

+1 für den HELPP dank Mann, aber ich preferr den anderen Vorschlag oben in meinem Fall ist besser :) – sbaaaang