2016-11-13 24 views
5

Sau khi khắc phục sự cố, tôi đã xác định rằng khi tôi băm mật khẩu bằng cách sử dụng hàm password_hash của PHP, mã định danh mã hóa là $ 2y $. Tuy nhiên, khi tôi sử dụng hàm password_verify để so sánh mật khẩu được băm được lưu trữ với mật khẩu nhập của người dùng, password_verify sẽ không trả lại đúng. Nếu tôi tạo mật khẩu mới bằng cách sử dụng số nhận dạng $ 2a $ https://www.bcrypt-generator.com/ và thay thế mật khẩu được băm được lưu trữ bằng mật khẩu, nó sẽ trả về true.Tại sao php password_verify và password_hash sử dụng mã định danh mã hóa khác nhau?

Tôi hy vọng một người nào đó có thể giải thích tại sao password_hash ($ password, PASSWORD_DEFAULT) đang sử dụng $ 2y $ và tại sao password_verify() đang sử dụng $ 2a $. Hoặc bất cứ điều gì khác tôi có thể làm sai ở đây cho vấn đề đó. Tôi đang làm điều này tại địa phương trên WAMP Server chạy PHP Phiên bản 7.0.10.

Dưới đây là ví dụ về mã tôi gặp sự cố với (số nhận dạng $ 2y $ sẽ không trả lại giá trị đúng).

<?php 
// $hashNotWorking came from password_hash("testing", PASSWORD_DEFAULT)."\n"; 
$hashNotWorking = '$2y$10$DNPos6f7Vo4Z2IrYU./eCObD7BMkwlkK9yiYjb0hvnI14B1dbFHbC'; 

if (password_verify('testing', $hashNotWorking)) { 
echo 'Password is valid!'; 
} else { 
echo 'Invalid password.'; 
} 
?> 

Dưới đây là ví dụ về mã đang hoạt động ($ 2a $ mã hóa KHÔNG được tạo bởi hàm password_hash).

<?php 
// $hashWorking came from https://www.bcrypt-generator.com/ 
$hashWorking = '$2a$08$uP75n/pDhUZo6qOOM3DuPug5U2fcSXW4f3MUz8p3SlO5yPZ4fLf9O'; 

if (password_verify('testing', $hashWorking)) { 
echo 'Password is valid!'; 
} else { 
echo 'Invalid password.'; 
} 
?> 

Cảm ơn bạn đã trợ giúp.

+0

http://stackoverflow.com/questions/4795385/how-do-you-use-bcrypt-for-hashing-passwords-in-php#comment8558243_6337021 xem nhận xét đó và phần còn lại trên trang đó. –

+1

Tôi nghi ngờ những gì bạn đã đăng cho người đầu tiên được băm đúng cách. Đảm bảo rằng không có ngắt dòng hoặc
được giới thiệu trong quá trình băm; Tôi đã thấy điều đó xảy ra trước đây. –

+0

Cảm ơn bạn Fred. Tôi đã sử dụng "\ n" bởi vì đó là những gì các ví dụ php.net đã có. Tôi cũng đã thử mà không có và vẫn không thể có được một sự thật. Tôi đang đọc liên kết bạn đã đăng ngay bây giờ. Đang cố gắng nghiên cứu thêm. –

Trả lời

4

Tôi nghi ngờ rằng có thể có khoảng trắng được giới thiệu trong băm gốc và/hoặc một số <br> hoặc một số có thể đã được người dùng giới thiệu.

Tôi đã thấy các trường hợp như thế này thường trước đây.

Nếu đúng như vậy, trim().

Tạo mã băm mới theo những gì tôi đã đề cập trong nhận xét và nó sẽ hoạt động.

echo $var = password_hash("testing", PASSWORD_DEFAULT)."\n"; 

Sau đó, dán nó vào vị trí của hàm băm hiện tại của bạn.

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