2013-11-09 20 views
6

tôi đã được đọc lên về an ninh mật khẩu trong PHP và tôi stumbled khi một tuyên bố thú vị:Tại sao chuỗi được băm với băm của nó khi muối trả về băm?

Băm mật khẩu với hash của nó như là muối trả về cùng băm

Nếu không có nhiều suy nghĩ, tôi đã đi trên php.net và thấy rằng đó là nói cùng một điều.

Hãy xem xét một ví dụ:

crypt("test", "test"); -> teH0wLIpW0gyQ 
crypt("test", "teH0wLIpW0gyQ"); -> teH0wLIpW0gyQ 

Tôi hoàn toàn có thể hiểu rằng hầm mộ trong PHP tạo ra một băm một chiều của chuỗi nhất định.

  1. Điều tôi không hiểu là làm thế nào chúng ta có thể nhận được cùng một đầu ra băm bằng cách sử dụng hai muối hoàn toàn khác nhau?
  2. Điều đó có nghĩa là có thể có các muối khác có thể mang lại cho tôi cùng một giá trị băm?

Theo dõi

Cảm ơn tất cả các bạn cho con trỏ của bạn. Bây giờ tôi có thể thấy rằng hành vi mặc định là chỉ sử dụng hai ký tự đầu tiên của muối, mà hoàn toàn trả lời tất cả các câu hỏi của tôi. Cảm thấy giống như một điều ngớ ngẩn, nhưng ...

+0

Câu trả lời cho # 2 là không đáng kể, do nguyên tắc pigeonhole. Điều này ảnh hưởng đến hầu như tất cả mọi thứ được xây dựng trên băm và không phải là một vấn đề trong một hệ thống được thiết kế tốt, vì * none * của các đầu vào tạo ra cùng một băm là khả thi để đoán hoặc tìm ra. – delnan

+0

Câu trả lời cho # 1 là: nó phụ thuộc vào thuật toán mã hóa. Không có câu trả lời chung cho câu hỏi đó. Tôi không biết các hoạt động cơ bản của hàm 'crypt', nhưng ngay cả khi tôi đã làm, tôi nghi ngờ nó sẽ là một câu trả lời ngắn ;-) –

+0

Nói chung, có; có thể có nhiều hơn một muối sẽ cung cấp cho cùng một băm, nhưng với một trang web được bôi trơn tốt, điều này không phải là một nguyên nhân chính gây ra mối quan tâm –

Trả lời

3

1. Những gì tôi không hiểu là làm thế nào chúng ta có thể có được cùng một đầu ra băm bằng cách sử dụng hai loại muối hoàn toàn khác nhau?

Mặc dù bạn đã cung cấp các muối khác nhau cho hàm crypt, nó sử dụng cùng một muối trong nội bộ, i. e., te. Điều này là do cách crypt được triển khai:

Băm tiêu chuẩn dựa trên với một muối hai ký tự từ bảng chữ cái "./0-9A-Za-z".

Vì vậy, ngay cả khi bạn cung cấp muối dài hơn 2 ký tự, nó sẽ chỉ lấy hai ký tự đầu tiên.

Và khi đầu ra của crypt chứa muối đã sử dụng được thêm vào băm được tính toán, sử dụng mã băm crypt do muối tạo ra chính xác cùng một đầu ra.Và đó chỉ là hoàn hảo như sau đó sau đây có thể được sử dụng để xác minh một mật khẩu được lưu trữ:

crypt($password, $hash) === $hash 


2. Nó có nghĩa là có thể có các muối khác có thể cho tôi cùng một băm?

Có. This does also apply to other crypt algorithms like bcrypt.

4

Điều này được thực hiện với mục đích. Hàm crypt của bạn, khi đối số thứ hai bao gồm các chữ cái và chữ số, chỉ sử dụng hai ký tự đầu tiên của "muối" để mã hóa và hai ký tự đó được đặt ở đầu kết quả. Vì vậy,

crypt("test", "test");  -> teH0wLIpW0gyQ 
crypt("test", "te");   -> teH0wLIpW0gyQ 
crypt("test", "tea");   -> teH0wLIpW0gyQ 
crypt("test", "temperature"); -> teH0wLIpW0gyQ 
etc. 

này được thực hiện để dễ dàng kiểm tra mật khẩu chính xác, do đó
crypt($password, crypt($password, $salt)) == crypt($password, $salt)

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