2014-04-02 19 views
7

Tôi đang sử dụng mô-đun bcrypt để băm và so sánh mật khẩu băm.Mật khẩu Node.js băm mật khẩu băm thay thế bằng mật mã

Điều tôi muốn làm là xóa mô-đun bcrypt và sử dụng thư viện mặc định crypto cả khi băm và so sánh mật khẩu.

Điều này có khả thi không?

Điều này sẽ kém an toàn hơn khi sử dụng node-bcrypt?

Bạn có bất kỳ ví dụ/hướng dẫn/doc/liên kết nào về cách thực hiện không?

hoặc ví dụ tôi đang làm như thực sự này:

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

tôi chỉ muốn lặp lại điều này với crypto nếu có thể:

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

Trả lời

7

Bạn có thể băm sử dụng pbkdf2 từ thư viện crypto: thực hiện

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

mẫu:

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

đây đi các tài liệu tham khảo: https://nodejs.org/api/crypto.html#crypto_crypto_pbkdf2_password_salt_iterations_keylen_digest_callback

Nó sử dụng thuật toán HMAC tiêu hóa như SHA512 để lấy được một chìa khóa có độ dài cho từ mật khẩu, muối và lặp đi lặp lại nhất định. Pbkdf2 có các tính năng chậm tương tự như bcrypt. Với PBKDF2, bcrypt hoặc scrypt, kẻ tấn công chỉ có thể thực hiện vài nghìn lần đoán mỗi giây (hoặc ít hơn, tùy thuộc vào cấu hình).

+0

excatly những gì tôi cần thx rất nhiều – sbaaaang

+1

Lưu ý rằng kẻ tấn công sử dụng [oclHashcat với GPU] (http://hashcat.net/ oclhashcat /) hoặc tương tự có thể thực hiện nhiều dự đoán hơn mỗi giây so với bạn, trừ khi bạn thực sự tăng tốc độ lặp lại. Ví dụ, một máy tính đơn với đồng hồ lõi 8x9 R9 290Xstock của AMD có thể kiếm được ít hơn 1,3 triệu PBKDF2-HMAC-SHA-1 (mật khẩu, muối, 8192,20) kiểm tra mỗi giây, tức là 3,4E12 hoặc 2^41 đoán mỗi 30 ngày. Bạn phải tăng số lần lặp của bạn (hoặc hệ số công việc BCrypt) để uốn cong phong cách của chúng hơn. –

+0

@ Anti-weakpasswords Có, tốc độ CPU và CPU luôn được nâng cấp, đó là lý do tại sao bạn có cấu hình lặp lại trong pbkdf2, vì vậy bạn luôn có thể giữ số dư – Masum

3

bcrypt sẽ được an toàn hơn crypto, đơn giản chỉ vì nó chậm hơn. Tuy nhiên, đây là một số chức năng mật khẩu tôi đã viết trong coffeescript sử dụng mật mã (Tôi tham gia create_password phần với một '$', bạn sẽ thấy rằng sự chia rẽ trong check_password): sử dụng

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

Ví dụ:

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

Vâng, đó là di sản được lưu trữ theo cách đó và ứng dụng của tôi không yêu cầu bất cứ điều gì siêu an toàn. Rõ ràng cấu hình mặc dù! –

+0

+1 cho helpp, nhờ người đàn ông nhưng tôi thích các đề xuất khác ở trên trong trường hợp của tôi là tốt hơn :) – sbaaaang

Các vấn đề liên quan