Mật khẩu là muối, vâng. Muối được thêm vào mật khẩu trước khi băm, để đảm bảo rằng băm không thể sử dụng được trong một rainbow table attack.
Vì muối được tạo ngẫu nhiên mỗi lần bạn gọi hàm, băm mật khẩu kết quả cũng khác nhau. Hàm băm trả về bao gồm muối được tạo ra để vẫn có thể xác minh chính xác mật khẩu.
Demo:
>>> from werkzeug.security import generate_password_hash
>>> generate_password_hash('foobar')
'pbkdf2:sha1:1000$tYqN0VeL$2ee2568465fa30c1e6680196f8bb9eb0d2ca072d'
>>> generate_password_hash('foobar')
'pbkdf2:sha1:1000$XHj5nlLU$bb9a81bc54e7d6e11d9ab212cd143e768ea6225d'
Hai dây khác nhau; nhưng chứa đầy đủ thông tin để xác minh mật khẩu vì muối tạo ra được bao gồm trong mỗi:
# pbkdf2:sha1:1000$tYqN0VeL$2ee2568465fa30c1e6680196f8bb9eb0d2ca072d
^^^^^^^^^^^^^^^^ salt ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
algo info ^^^^^^^^ actual hash of the password
(PBKDF2 applied SHA1 1000 times)
Bởi vì muối ngẫu nhiên là tYqN0VeL
cho một và XHj5nlLU
, băm kết quả cũng khác nhau.
Mật khẩu foobar
vẫn có thể được xác nhận chống lại hoặc băm:
>>> from werkzeug.security import check_password_hash
>>> check_password_hash('pbkdf2:sha1:1000$tYqN0VeL$2ee2568465fa30c1e6680196f8bb9eb0d2ca072d', 'foobar')
True
>>> check_password_hash('pbkdf2:sha1:1000$XHj5nlLU$bb9a81bc54e7d6e11d9ab212cd143e768ea6225d', 'foobar')
True
Xem thêm
Nguồn
2014-05-02 16:10:32
Hóa ra tôi đã cắt ngắn nó khi tôi đã lưu trữ nó trong databas của tôi e. Kết quả là, tôi không thể so sánh nó đúng :-) –
Cảm ơn bạn đã đặt câu hỏi này - Tôi đã khởi động lại để thực hiện so sánh thay vì sử dụng phương thức check_password_hash(). Sẽ không biết phải làm gì khác ngoài câu trả lời cho câu hỏi. Upvote cho cả hai bạn. – JakeJ