2012-07-09 17 views
6

thể trùng lặp:
Secure hash and salt for PHP passwordsSử dụng md5 bảo đảm thậm chí nó khó khăn hơn

tôi thấy một người nào đó mã hóa một hash mật khẩu như thế này,

md5(uniqid(mt_rand('password', 15), true)); 

là một cách bảo đảm để làm điều này? thậm chí có hiệu quả không?

+8

Làm cách nào để xác minh mật khẩu khi mật khẩu được băm?Ngoài ra 'mt_rand' lấy ints làm tham số của nó, không phải là chuỗi. –

+1

Ah, @Rocket những gì một câu hỏi ?? !!! – Engineer

+0

Cá nhân tôi sử dụng [phpass] (http://www.openwall.com/phpass/). –

Trả lời

6

Không chỉ không an toàn, nó còn không hoạt động.

mt_rand lấy 2 tham số, giá trị tối thiểu và giá trị tối đa.

mt_rand('password', 15) 

này chuyển 'password' đến một int (0), sau đó trả về một số ngẫu nhiên giữa 015.

uniqid(mt_rand('password', 15), true) 

sau đó này tạo ra một ID duy nhất, và prepends số ngẫu nhiên từ các bước trước để nó: tính toán một cái gì đó như thế này:

144ffb22886d58e1.82100749 

chuỗi Đó là sau đó md5'd.

Như bạn có thể thấy, mã này vô dụng 100%. Mật khẩu ban đầu được chuyển đổi thành 0 và bị mất vĩnh viễn, vì vậy tất cả những gì bạn đang làm là băm các số ngẫu nhiên, điều đó là vô nghĩa. Bây giờ bạn có băm của bạn, không có cách nào để xác minh lại nó. Kể từ khi mật khẩu được chuyển đổi, bất cứ điều gì người dùng nhập không quan trọng.

Vì vậy, không, mã này không an toàn, không sử dụng.

Cá nhân, tôi sử dụng số phpass library. Nó an toàn và dễ sử dụng.

+0

Cho phép nói nếu tôi sử dụng mà không có 'mt_rand()' như thế này, 'md5 (uniqid ('passwrd', true));' là tốt hơn? – itsme

+0

@itsme: Vấn đề là: làm cách nào để xác minh mật khẩu sau? Bạn cần có khả năng tạo ra cùng một băm sau đó, và bạn không thể làm điều đó với 'uniqid'. ['uniqid'] (http://php.net/manual/en/function.uniqid.php) không có nghĩa là cho mật khẩu, nó tạo ra các ID duy nhất (như UUID). –

+1

Tại sao lại là -1? Có gì sai với câu trả lời này? –

2

Thành thật mà nói, tôi thậm chí sẽ không sử dụng md5 như một thuật toán băm để lưu mật khẩu. Tôi sẽ xem xét sử dụng một cái gì đó như bcrypt. Ngoài ra tôi thậm chí không biết làm thế nào ví dụ của bạn sẽ làm việc, nhưng trong mọi trường hợp nếu bạn muốn bảo đảm nó sau đó tránh xa md5, sha1 ở mức tối thiểu và học hỏi từ những người khác sai lầm và sử dụng một muối.

+0

Tôi nghĩ md5 có thể an toàn nếu bạn sử dụng một loại muối tốt, nhưng tôi đồng ý rằng các thuật toán mới hơn là cách để đi. –

+1

@Rocket Nếu bạn sử dụng md5() chỉ để băm mật khẩu với muối thì không an toàn – PeeHaa

+0

MD5 đã được tối ưu hóa tối ưu về hiệu suất và do đó trong một số trường hợp khả thi vẫn còn khả thi, nhưng tôi vẫn không khuyên dùng MD5 để thực hiện an toàn băm mật khẩu. – sean

11

Không, đó không phải là cách an toàn. Nó có thể crack và, trong ví dụ của bạn, nó không lặp lại được. Bạn sẽ phải lưu trữ giá trị ngẫu nhiên dài với chính băm. Nếu thứ DB bị xâm nhập, thì nó trở nên vô cùng đơn giản để bruteforce băm.

Bạn nên biết rằng MD5 và SHA1 là hai thuật toán băm yếu nhất, có sẵn trong PHP.

Tốt hơn hết là sử dụng chức năng crypt(), với CRYPT_BLOWFISH hoặc PBKDF2.

cập nhật

Ngoài ra, như PeeHaa đã đề cập, nó không hoạt động. mt_rand('password', 15) sẽ gây ra Warning: mt_rand() expects parameter 1 to be long, string given on line X.

+0

@ PeeHaa, vâng, vâng, bởi vì nó không lặp lại được. –

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