Python sử dụng một hạt băm ngẫu nhiên để ngăn những kẻ tấn công đục lỗ ứng dụng của bạn bằng cách gửi cho bạn các khóa được thiết kế để va chạm. Xem tiết lộ lỗ hổng ban đầu . Bằng cách bù trừ hàm băm bằng một hạt ngẫu nhiên (được đặt một lần khi khởi động), kẻ tấn công không còn có thể dự đoán các phím nào sẽ va chạm.
Bạn có thể đặt hạt giống cố định hoặc vô hiệu hóa tính năng bằng cách đặt PYTHONHASHSEED
biến môi trường ; mặc định là random
nhưng bạn có thể đặt nó thành một giá trị nguyên dương cố định, với 0
việc tắt hoàn toàn tính năng này.
Phiên bản Python 2.7 và 3.2 có tính năng bị vô hiệu hóa theo mặc định (sử dụng công -R
tắc hoặc thiết lập PYTHONHASHSEED=random
để bật tính năng này); nó được bật theo mặc định trong Python 3.3 trở lên.
Nếu bạn đang dựa vào thứ tự các khóa trong một tập hợp Python, thì không. Python sử dụng bảng băm để triển khai các loại này và thứ tự của chúng phụ thuộc vào lịch sử chèn và xóa cũng như hạt băm ngẫu nhiên. Lưu ý rằng trong Python 3.5 trở lên, điều này cũng áp dụng cho từ điển.
Cũng xem object.__hash__()
tài liệu phương pháp đặc biệt :
Lưu ý : Theo mặc định, __hash__()
giá trị của các đối tượng str, byte và datetime là "muối" với một giá trị ngẫu nhiên không thể đoán trước. Mặc dù chúng không đổi trong một quy trình Python riêng lẻ, chúng không thể dự đoán được giữa các lần gọi Python lặp lại.
Điều này nhằm cung cấp khả năng bảo vệ chống lại sự từ chối dịch vụ gây ra bởi các đầu vào được lựa chọn cẩn thận khai thác hiệu suất trong trường hợp xấu nhất của việc chèn chính tả, độ phức tạp O (n ^ 2). Xem http://www.ocert.org/advisories/ocert-2011-003.html để biết thêm chi tiết.
Việc thay đổi giá trị băm ảnh hưởng đến thứ tự lặp lại của các phần, bộ và các ánh xạ khác. Python chưa bao giờ đảm bảo về thứ tự này (và nó thường thay đổi giữa các bản dựng 32 bit và 64 bit).
Xem thêm PYTHONHASHSEED
.
Nếu bạn cần một triển khai băm ổn định, bạn có thể muốn xem xét hashlib
mô-đun ; điều này thực hiện các hàm băm mật mã. Các dự án pybloom sử dụng phương pháp này .
Vì phần bù bao gồm tiền tố và hậu tố (giá trị bắt đầu và giá trị XORed cuối cùng, tương ứng) nên rất tiếc, bạn không thể chỉ lưu trữ phần bù. Mặt tích cực, điều này có nghĩa là những kẻ tấn công cũng không thể dễ dàng xác định được sự bù đắp với các cuộc tấn công định thời.