2014-04-02 13 views
7

Używam modułu bcrypt do mieszania i porównywania haszowanych haseł.Hasło Node.js hashowanie bcryptu alternatywnego przy użyciu crypto

Co chcę zrobić, to usunąć moduł bcrypt i użyć domyślnej biblioteki crypto zarówno do haszowania, jak i porównywania haseł.

Czy to możliwe?

Czy to będzie mniej bezpieczne niż używanie node-bcrypt?

Czy masz przykład/samouczek/doc/link, jak to zrobić?

lub przykład robię tak rzeczywiście:

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

ja właśnie chciałbym powtórzyć to z krypto jeśli to możliwe:

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

Odpowiedz

7

można hash używając PBKDF2 od krypto biblioteki: realizacja

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

Próbka:

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

tu idzie odniesienie: https://nodejs.org/api/crypto.html#crypto_crypto_pbkdf2_password_salt_iterations_keylen_digest_callback

używa algorytmu HMAC digest takich jak SHA512 w celu uzyskania klucza o określonej długości z danym hasłem, solą i iteracji. Pbkdf2 ma podobne funkcje spowolnienia, jak bcrypt. W przypadku PBKDF2, bcrypt lub scrypt, atakujący może wykonać tylko kilka tysięcy zgadowań na sekundę (lub mniej, w zależności od konfiguracji).

+0

co mi się bardzo podoba. – sbaaaang

+1

Należy zauważyć, że osoby atakujące używają [oclHashcat z procesorami graficznymi] (http://hashcat.net/ oclhashcat /) lub podobny może dać o wiele więcej przypuszczeń na sekundę niż ty, chyba że naprawdę przyspieszysz iteracje. Na przykład pojedynczy komputer z zegarem rdzenia 8x AMD R9 290 Xstock może wykonać mniej więcej 1,3 miliona testów PBKDF2-HMAC-SHA-1 (hasło, sól, 8192,20) na sekundę, tj. 3,4E12 lub 2^41 wartości co 30 dni. Musisz zwiększyć liczbę iteracji (lub współczynnik pracy BCrypt), aby bardziej podkręcić swój styl. –

+0

@ Anti-weakpasswords Tak, prędkości procesora i gpu zawsze się aktualizują, dlatego masz konfigurowalne iteracje w pbkdf2, więc zawsze możesz zachować równowagę – Masum

3

bcrypt będą bardziej bezpieczne niż krypto, po prostu dlatego, jest wolniej. Jednakże, oto niektóre funkcje hasło pisałem w coffeescript za pomocą crypto (łączę części create_password z „$”, zobaczysz, że rozłam w check_password):

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

Przykład użycia:

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

Tak, to było zapisane w ten sposób, a moja aplikacja nie wymagała niczego super bezpiecznego. Oczywiście konfigurowalne! –

+0

+1 za pomoc, dzięki człowiekowi, ale wolę inną sugestię powyżej w moim przypadku jest lepsza :) – sbaaaang