Tôi đang học về hàm crypt() của PHP và đã chạy một số thử nghiệm với nó. Theo số this post, tôi nên sử dụng muối dài 22 ký tự. Tuy nhiên, tôi có thể sử dụng một chuỗi dài 23 ký tự với một số hạn chế. Khi tôi sử dụng chuỗi dài 22 ký tự, tôi luôn nhận được kết quả '$ 2y $ xxStringStringStringStri.HashHashHashHashHashHashHashHas'. Tôi biết thời kỳ này chỉ là một phần của muối.Tại sao tôi không nên sử dụng ký tự thứ 23 trong muối của hàm crypt()?
Có vẻ như nếu tôi sử dụng 23 ký tự thay vì chỉ 22, tôi có thể tạo thành công các băm khác nhau, nhưng chỉ có 4 kết quả khác nhau cho tất cả 64 ký tự. Ký tự thứ 23 "làm tròn" xuống gần 1/4 của ký tự 64 ký tự (ví dụ: ký tự thứ 23 là "W" và làm tròn xuống "O" hoặc bất kỳ số nào tròn xuống "u")
v---------------v---------------v---------------v---------------
./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890
Tất cả bốn người trong số các chức năng hầm mộ tạo ra các muối tương tự:
crypt('Test123','$2y$09$AAAAAAAAAAAAAAAAAAAAAq');
crypt('Test123','$2y$09$AAAAAAAAAAAAAAAAAAAAAr');
crypt('Test123','$2y$09$AAAAAAAAAAAAAAAAAAAAAs');
crypt('Test123','$2y$09$AAAAAAAAAAAAAAAAAAAAAt');
Nhưng, lần này là khác nhau:
crypt('Test123','$2y$09$AAAAAAAAAAAAAAAAAAAAAu');
Vậy tại sao tôi không nên sử dụng ký tự thứ 23 khi nó có thể tạo thành những kết quả khác nhau? Có một số loại hành vi không ổn định trong PHP mà nên tránh bằng cách không sử dụng nó?
Để làm rõ về cách tôi đang đếm kí tự thứ 23 trong muối:
crypt('Test123','$2y$08$ABCDEFGHIJKLMNOPQRSTUV');
// The salt is '$ABCDEFGHIJKLMNOPQRSTUV'
// Which will be treated as '$ABCDEFGHIJKLMNOPQRSTUO'
Có giải thích tốt về câu hỏi này: http://security.stackexchange.com/questions/20862/php-crypt-trims-the-salt-as-it-would-be-too-long –
Cảm ơn bạn đã phản ứng này. Mặc dù điều này chỉ giải quyết những gì xảy ra với ký tự thứ 23 vì nó chỉ được rút ngắn do kích thước của các bit được cho phép trong hàm crypt(). Câu hỏi của tôi, theo một cách khác để hỏi, là "Tôi có nên sử dụng nhân vật thứ 23 ngay cả khi nó sẽ bị cắt thành hai bit?" hoặc một cách khác là "Có một trục trặc trong thuật toán của PHP mà tạo ra băm không chính xác bất cứ khi nào nhân vật thứ 23 được sử dụng?" – Andrew