Tôi đang tìm một giải pháp đơn giản, an toàn để lưu trữ mật khẩu của người dùng bằng Nút. Tôi là một người mới làm quen với mật mã, nhưng đã cố gắng kết hợp một giải pháp với nhau từ nghiên cứu trực tuyến. Tôi đang tìm kiếm xác nhận rằng những gì tôi đưa ra là một giải pháp vững chắc cho một ứng dụng web với các yêu cầu bảo mật cơ bản (không phải ngân hàng, bệnh viện, v.v.). Ở đây là:Thực hành tốt nhất về mật mã để lưu trữ mật khẩu trong Node
var crypto = require('crypto');
var SALT_LENGTH = 64;
var KEY_LENGTH = 64;
var ITERATIONS = 1000;
function createHashedPassword(plainTextPassword, cb) {
crypto.randomBytes(SALT_LENGTH, function (err, salt) {
console.time('password-hash');
crypto.pbkdf2(plainTextPassword, salt, ITERATIONS, KEY_LENGTH, function (err, derivedKey) {
console.timeEnd('password-hash');
return cb(null, {derivedKey: derivedKey, salt: salt, iterations: ITERATIONS});
});
});
};
... và đây là những lựa chọn tôi làm điều đó mang lại cho tôi đến thời điểm này:
thuật toán băm gì để sử dụng không?
Dựa trên this widely referenced article, có vẻ như ứng cử viên hàng đầu là PBKDF2, bcrypt và scrypt. Tôi đã chọn PBKDF2 vì nó đã được hỗ trợ trong Node.
Kích thước muối nào cần sử dụng?
This stack overflow answer dường như là câu trả lời đơn giản nhất mà tôi có thể tìm thấy. Tôi vẫn không rõ ràng về lý do tại sao 64 byte là kích thước muối phải mặc dù. Khi tôi google xung quanh, tôi nhận được câu trả lời trao đổi stack khác như this, nhưng tôi không chắc chắn nó áp dụng cho các thuật toán Node? Hoàn toàn nhầm lẫn ở đây, một lời giải thích nhằm vào một người mới sử dụng chức năng Node này sẽ là tuyệt vời.
Độ dài khóa nào cần sử dụng?
Một lần nữa, tôi chủ yếu dựa trên lựa chọn của mình là tắt the same answer as above, nhưng tôi chỉ là sương mù về các khái niệm cơ bản về 'lý do'. Câu trả lời nói rằng 'đó là một sự lãng phí để tạo ra các phím nhỏ hơn đầu vào của bạn, vì vậy hãy sử dụng ít nhất 64 byte'. Huh? Một lần nữa, một lời giải thích thực tế sẽ hữu ích.
Có bao nhiêu lần lặp lại để sử dụng?
Đối với câu hỏi này, tôi dựa trên lựa chọn của mình là this stack exchange answer. Tôi không hiểu nhiều về nó, nhưng tôi đã nhận được rằng thuật toán được cho là mất khoảng 8ms. Vì vậy, như bạn có thể thấy tôi đặt hẹn giờ vào chức năng, và tôi điều chỉnh các lần lặp lại của tôi để có được nó trong đó ballpark trên máy tính của tôi.
Cảm ơn!
Khi nói đến an ninh, nó thường là tốt hơn để dính vào nổi tiếng và thư viện được kiểm tra tốt. Passport.JS đến với tâm trí và nó có các plugin bạn có thể sử dụng để xử lý băm. –
Cảm ơn @ Pier-LucGendreau. Tôi đang sử dụng PassportJS, nhưng nó không bao gồm mã cho băm và lưu trữ mật khẩu như là một phần của thư viện của nó, hoặc nó là mô-đun phụ. Nếu tôi thiếu điều gì đó, hãy cho tôi biết. – markdb314
Bạn có thể sử dụng https://github.com/saintedlama/passport-local-mongoose –