Nói chung, bạn không cần sử dụng nhiều hơn một thuật toán băm.
Những gì bạn cần làm là:
Sử dụng muối: muối không được sử dụng chỉ để làm cho mật khẩu của bạn an toàn hơn , nó được sử dụng để tấn công bảng cầu vồng. Bằng cách đó, ai đó sẽ có một công việc khó khăn hơn khi cố gắng tính toán trước hàm băm cho mật khẩu bạn lưu trữ trong hệ thống của bạn.
Sử dụng nhiều tương tác: thay vì chỉ thực hiện SHA (mật khẩu + muối), hãy thực hiện SHA (SHA (SHA (SHA (SHA (... SHA (mật khẩu + muối)))))). Hoặc, để đại diện theo cách khác:
hash = sha(password + salt)
for i=1 , i=5000, i++ {
hash = sha(hash + salt);
}
Và, cuối cùng, chọn một chức năng băm tốt. SHA, MD5, v.v., không tốt vì chúng quá nhanh . Vì bạn muốn sử dụng hàm băm để bảo vệ, tốt hơn hết bạn nên sử dụng hàm băm chậm hơn. Ví dụ, hãy xem Bcrypt , PBKDF2 hoặc Scrypt .
chỉnh sửa : sau khi quan sát, chúng ta hãy thử xem một số điểm (xin lỗi, giải thích dài để đi đến cuối cùng, bởi vì nó có thể giúp người khác tìm kiếm câu trả lời tương tự):
Nếu hệ thống của bạn an toàn, như không ai sẽ có quyền truy cập vào mật khẩu được lưu trữ, bạn sẽ không cần băm. Mật khẩu sẽ là bí mật, không ai có được nó.
Nhưng không ai có thể đảm bảo rằng cơ sở dữ liệu với mật khẩu sẽ bị đánh cắp. Ăn cắp cơ sở dữ liệu, có tất cả các mật khẩu. Ok, hệ thống của bạn và công ty của bạn sẽ chịu tất cả các hậu quả của nó. Vì vậy, chúng tôi có thể cố gắng tránh rò rỉ mật khẩu này.
THÔNG BÁO rằng chúng tôi không lo lắng về các cuộc tấn công trực tuyến trong thời điểm này. Đối với một cuộc tấn công trực tuyến, giải pháp tốt nhất là làm chậm sau khi mật khẩu xấu, khóa tài khoản sau một số lần thử, v.v. Và điều đó không quan trọng bằng cách bạn mã hóa, băm, lưu trữ, v.v., mật khẩu của bạn. Tấn công trực tuyến là một vấn đề làm chậm các đầu vào mật khẩu .
Vì vậy, trở lại don't let them take my plain passwords
vấn đề. Câu trả lời rất đơn giản: đừng lưu trữ chúng dưới dạng văn bản đơn giản. OK đã nhận nó.
Làm thế nào để tránh điều đó?
Mã hóa mật khẩu (?). Nhưng, như bạn biết, nếu bạn mã hóa nó, bạn có thể giải mã lại, nếu bạn có khóa thích hợp. Và bạn sẽ kết thúc với vấn đề "nơi cất giấu" chìa khóa. Hum, không tốt, vì họ có cơ sở dữ liệu của bạn, họ có thể lấy chìa khóa của bạn. Ok, chúng ta đừng sử dụng nó.
Vì vậy, một cách tiếp cận khác: hãy chuyển đổi mật khẩu theo thứ khác không thể đảo ngược và lưu trữ nó. Và để xác minh xem mật khẩu được cung cấp có đúng không, chúng tôi thực hiện lại quy trình tương tự và kiểm tra xem hai giá trị tranformed có khớp hay không. Nếu chúng khớp = mật khẩu tốt đã được cung cấp.
Ok, cho đến nay rất tốt. Hãy sử dụng một số băm MD5 trong mật khẩu. Nhưng ... nếu ai đó có giá trị băm mật khẩu được lưu trữ của chúng tôi, anh ta có thể có rất nhiều sức mạnh máy tính để tính băm MD5 của mọi mật khẩu có thể (lực lượng vũ phu), vì vậy anh ta có thể tìm thấy mật khẩu ban đầu. Hoặc, thậm chí tệ nhất, anh ta có thể lưu trữ tất cả MD5 từ tất cả các kết hợp ký tự và dễ dàng tìm thấy mật khẩu. Vì vậy, hãy thực hiện nhiều lần lặp, điều HASH (HASH (HASH ())), để làm cho nó khó hơn, vì sẽ mất nhiều thời gian hơn.
Nhưng ngay cả điều đó có thể được lưu hành, bảng cầu vồng đã được tạo ra chính xác để tăng tốc chống lại loại bảo vệ này.
Vì vậy, hãy sử dụng một ít muối trên nó. Bằng cách này, tại mỗi tương tác, muối được sử dụng lại. Một người cố gắng tấn công mật khẩu của bạn sẽ phải tạo bảng cầu vồng xem xét rằng muối được thêm vào mỗi lần. Và khi anh ta tạo bảng cầu vồng đó, vì nó được tạo bằng một muối, anh ta sẽ phải tính toán lại với muối kia, vì vậy anh ta sẽ phải dành thời gian cho mỗi mật khẩu (= mỗi muối). Muối sẽ không thêm "phức tạp" hơn vào mật khẩu, nó sẽ khiến kẻ tấn công mất thời gian tạo bảng cầu vồng, nếu bạn sử dụng một muối cho mỗi mật khẩu, thì bảng từ một muối sẽ vô dụng với mật khẩu khác.
Và sử dụng nhiều hơn một hàm băm sẽ giúp gì ở đây? Không. Người tạo ra một cuộc tấn công cầu vồng cụ thể sẽ có thể tạo ra nó bằng cách sử dụng một hoặc nhiều băm.
Và việc sử dụng nhiều hơn một hàm băm có thể dẫn bạn đến một vấn đề: nó an toàn như hàm băm yếu nhất bạn sử dụng. Nếu ai đó tìm thấy xung đột trong một thuật toán băm, thì đó là hàm băm sẽ được khai thác, tại bất kỳ điểm nào của quá trình lặp, để phá mật khẩu. Vì vậy, bạn không đạt được bất cứ điều gì bằng cách sử dụng nhiều thuật toán băm hơn, tốt hơn là chỉ chọn một thuật toán tốt. và sử dụng nó. Và nếu yuo từng nghe rằng nó đã bị hỏng, hãy nghĩ cách bạn sẽ thay đổi nó trong ứng dụng của mình.
Và tại sao sử dụng bcrypt hoặc một cái gì đó tương tự (bạn nói bạn sử dụng nó): bởi vì kẻ tấn công sẽ phải mất nhiều thời gian hơn để tạo các bảng. Đó là lý do tại sao sử dụng MD5 + chờ đợi (3 giây) không giúp ích gì: dù sao cuộc tấn công sẽ ngoại tuyến, vì vậy kẻ tấn công có thể tạo các bảng mà không bị trì hoãn (3 giây).