Python은 무작위 해시 시드를 사용하여 공격자가 충돌하도록 설계된 키를 전송하여 애플리케이션의 타르 피팅을 방지합니다. 원래의 취약성 공개를 참조하십시오 . 임의의 시드 (시작시 한 번 설정)로 해시를 상쇄함으로써 공격자는 더 이상 어떤 키가 충돌할지 예측할 수 없습니다.
PYTHONHASHSEED
환경 변수를 설정하여 고정 시드를 설정하거나 기능을 비활성화 할 수 있습니다 . 기본값은 이 기능을 모두 비활성화하여 random
고정 된 양의 정수 값으로 설정할 수 있습니다 0
.
Python 버전 2.7 및 3.2에는 기본적으로 기능이 비활성화되어 있습니다 ( -R
스위치 PYTHONHASHSEED=random
를 사용 하거나 활성화하도록 설정). Python 3.3 이상에서는 기본적으로 활성화되어 있습니다.
Python 세트의 키 순서에 의존하고 있다면 그렇게하지 마십시오. Python은 해시 테이블을 사용하여 이러한 유형을 구현하고 순서 는 임의 해시 시드뿐만 아니라 삽입 및 삭제 기록에 따라 다릅니다 . Python 3.5 및 이전 버전에서는 사전에도 적용됩니다.
object.__hash__()
특수 메소드 문서 도 참조하십시오 .
참고 : 기본적 __hash__()
으로 str, bytes 및 datetime 개체의 값은 예측할 수없는 임의의 값으로 "절대"됩니다. 개별 Python 프로세스 내에서 일정하게 유지되지만 반복되는 Python 호출 간에는 예측할 수 없습니다.
이는 dict 삽입의 최악의 경우 성능 인 O (n ^ 2) 복잡성을 악용하는 신중하게 선택된 입력으로 인한 서비스 거부에 대한 보호를 제공하기위한 것입니다. 자세한 내용은 http://www.ocert.org/advisories/ocert-2011-003.html 을 참조하십시오.
해시 값을 변경하면 사전, 집합 및 기타 매핑의 반복 순서에 영향을줍니다. Python은이 순서에 대해 보증 한 적이 없습니다 (일반적으로 32 비트와 64 비트 빌드 사이에서 다릅니다).
을 (를) 참조하십시오 PYTHONHASHSEED
.
안정적인 해시 구현이 필요한 경우 hashlib
모듈 을 살펴보고 싶을 것입니다 . 이것은 암호화 해시 기능을 구현합니다. pybloom 프로젝트는이 방법을 사용합니다 .
오프셋은 접두사와 접미사 (각각 시작 값과 최종 XOR 값)로 구성되어 있으므로 불행히도 오프셋을 저장할 수 없습니다. 플러스 측면에서 이것은 공격자가 타이밍 공격으로 오프셋을 쉽게 결정할 수 없음을 의미합니다.