2014-10-22 27 views
8

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!

+0

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. –

+0

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

+0

Bạn có thể sử dụng https://github.com/saintedlama/passport-local-mongoose –

Trả lời

6

NPM gói credential xử lý tất cả những

Bạn có thể thấy ghi của tác giả lên trên nó trong cuốn sách Programming Javascript Applications

+0

Tôi đã xem các liên kết đó và gói 'chứng chỉ' dường như đang làm cùng loại điều tôi có ở trên. Trong nguồn của anh ta, anh ta sử dụng độ dài muối và chiều dài khóa là 66 byte, và mặc định là 1000 lần lặp. Trong readme cho gói, ông nói "muối nên có kích thước tương tự như băm. Không ngắn hơn, và không còn". Đây là tất cả thông tin tốt, nhưng tôi muốn xem ít nhất một lời giải thích cơ bản về 'tại sao'? – markdb314

+0

@ markdb314 'Tại sao' có lẽ sẽ được giải thích tốt hơn bởi http://security.stackexchange.com/ –

+0

Vâng, tôi có thể đăng ở đó ... nhưng câu trả lời thường đi vào chi tiết hơn tôi có thể làm theo. Tôi chỉ đang tìm ai đó để nói với tôi với sự tự tin những gì hằng số để sử dụng, và một 'lý do tại sao' đơn giản. – markdb314

2

Tôi mạnh mẽ sẽ khuyên bạn sử dụng bcrypt. Có rất nhiều lợi thế cho thuật toán và hầu hết các triển khai đều xử lý tất cả các câu hỏi này cho bạn.

Như đã trình bày trong this answer:

bcrypt có loại tốt nhất của danh tiếng mà có thể đạt được cho một thuật toán mã hóa: nó đã được khoảng một thời gian khá lâu, được sử dụng khá rộng rãi, "thu hút sự chú ý", và nhưng vẫn không bị gián đoạn cho đến nay.

Tôi đã viết lên một bài viết chi tiết về làm thế nào để thực hiện bcrypt trong nút/bày tỏ cũng như các khuôn khổ khác tại đây: http://davismj.me/blog/bcrypt

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