Luôn sử dụng thuật toán băm mật khẩu: Argon2 , scrypt , bcrypt hoặc PBKDF2 .
Argon2 giành chiến thắng trong cuộc thi băm mật khẩu 2015.Scrypt , bcrypt và PBKDF2 là các thuật toán cũ được coi là ít được ưa thích hơn bây giờ, nhưng về cơ bản vẫn có âm thanh, vì vậy nếu nền tảng của bạn chưa hỗ trợ Argon2, bạn có thể sử dụng thuật toán khác ngay bây giờ.
Không bao giờ lưu trữ mật khẩu trực tiếp trong cơ sở dữ liệu. Đừng mã hóa nó, nếu không, nếu trang web của bạn bị xâm phạm, kẻ tấn công sẽ lấy khóa giải mã và do đó có thể lấy được tất cả mật khẩu. Mật khẩu PHẢI được băm .
Một băm mật khẩu có tính chất khác nhau từ một hash bảng băm hoặc băm mật mã. Không bao giờ sử dụng hàm băm mật mã thông thường như MD5, SHA-256 hoặc SHA-512 trên mật khẩu. Thuật toán băm mật khẩu sử dụng một loại muối duy nhất (không được sử dụng cho bất kỳ người dùng nào khác hoặc trong cơ sở dữ liệu của bất kỳ ai khác). Muối là cần thiết để kẻ tấn công không thể tính toán trước các băm của mật khẩu phổ biến: với một loại muối, chúng phải khởi động lại phép tính cho mọi tài khoản. Một thuật toán băm mật khẩu là về bản chất chậm - chậm như bạn có thể đủ khả năng. Slowness làm tổn thương kẻ tấn công nhiều hơn bạn vì kẻ tấn công phải thử nhiều mật khẩu khác nhau. Để biết thêm thông tin, hãy xem Cách băm mật khẩu an toàn .
Băm mật khẩu mã hóa bốn mẩu thông tin:
- Một chỉ báo về thuật toán được sử dụng. Điều này là cần thiết cho sự nhanh nhẹn : các khuyến nghị về mật mã thay đổi theo thời gian. Bạn cần có khả năng chuyển sang một thuật toán mới.
- Một chỉ số khó khăn hoặc độ cứng. Giá trị này càng cao, càng cần nhiều tính toán để tính toán hàm băm. Đây phải là giá trị cấu hình không đổi hoặc toàn cầu trong chức năng thay đổi mật khẩu, nhưng nó sẽ tăng theo thời gian vì máy tính trở nên nhanh hơn, vì vậy bạn cần nhớ giá trị cho từng tài khoản. Một số thuật toán có một giá trị số duy nhất, một số thuật toán khác có nhiều tham số hơn (ví dụ để điều chỉnh việc sử dụng CPU và sử dụng RAM riêng biệt).
- Muối. Vì muối phải là duy nhất trên toàn cầu, nên nó phải được lưu trữ cho mỗi tài khoản. Muối nên được tạo ngẫu nhiên trên mỗi thay đổi mật khẩu.
- Băm thích hợp, tức là đầu ra của phép tính toán học trong thuật toán băm.
Nhiều thư viện bao gồm một hàm cặp đóng gói thông tin này một cách thuận tiện dưới dạng một chuỗi: một chuỗi lấy chỉ báo thuật toán, chỉ báo độ cứng và mật khẩu, tạo ra một muối ngẫu nhiên và trả về chuỗi băm đầy đủ; và một mật khẩu lấy mật khẩu và chuỗi băm đầy đủ làm đầu vào và trả về một boolean cho biết liệu mật khẩu có đúng hay không. Không có tiêu chuẩn chung, nhưng mã hóa phổ biến là
$ thuật toán $ tham số $ salt $ đầu ra
trong đó algorithm
một số hoặc một chuỗi ký tự chữ và số ngắn mã hóa sự lựa chọn của thuật toán, parameters
là một chuỗi có thể in salt
và output
được mã hóa trong Base64 mà không kết thúc=
.
16 byte là đủ cho muối và đầu ra. (Xem ví dụ: các đề xuất cho Argon2 .) Được mã hóa trong Base64, mỗi ký tự gồm 21 ký tự. Hai phần còn lại phụ thuộc vào thuật toán và tham số, nhưng 20 ký tự là4040 là điển hình. Đó là tổng cộng khoảng 82 ký tự ASCII ( CHAR(82)
và không cần Unicode), mà bạn nên thêm một giới hạn an toàn nếu bạn nghĩ rằng sẽ khó mở rộng trường sau này.
Nếu bạn mã hóa hàm băm ở định dạng nhị phân, bạn có thể giảm xuống còn 1 byte cho thuật toán, 1 byte4 byte cho độ cứng (nếu bạn mã hóa một số tham số) và 16 byte cho mỗi muối và đầu ra , với tổng số 37 byte. Nói 40 byte ( BINARY(40)
) để có ít nhất một vài byte dự phòng. Lưu ý rằng đây là các byte 8 bit, không thể in các ký tự, đặc biệt là trường có thể bao gồm các byte rỗng.
Lưu ý rằng độ dài của hàm băm hoàn toàn không liên quan đến độ dài của mật khẩu.