Python 3.3의 해시 함수가 세션 간에 서로 다른 결과를 반환함
저는 Python 3.3에서 BloomFilter를 구현했고 세션마다 다른 결과를 얻었습니다.이 이상한 동작을 드릴다운하면 내부 해시() 함수로 이동합니다. 이 함수는 세션마다 동일한 문자열에 대해 서로 다른 해시 값을 반환합니다.
예:
>>> hash("235")
-310569535015251310
새 파이썬 콘솔 열기 -----
>>> hash("235")
-1900164331622581997
왜 이런 일이 생기는 건가요?이것이 왜 유용합니까?
Python은 랜덤 해시 시드를 사용하여 공격자가 충돌하도록 설계된 키를 전송하여 응용 프로그램을 공격하는 것을 방지합니다.원본 취약성 공개를 참조하십시오.해시를 임의 시드(시작할 때 한 번 설정)로 오프셋하면 공격자는 더 이상 어떤 키가 충돌할지 예측할 수 없습니다.
환경 변수를 설정하여 고정 시드를 설정하거나 기능을 사용하지 않도록 설정할 수 있습니다. 기본값은random
의 정수할 수 .0
기능을 완전히 비활성화합니다.
2과 3이 하지 않도록 되어 있습니다(Python 에 2.7 서 3.2 는본 으버기없다수 ).-R
설정 느어쪽든PYTHONHASHSEED=random
활성화). Python 3.3 이상에서는 기본적으로 활성화되어 있습니다.
Python 세트의 키 순서에 의존했다면 하지 마십시오.Python은 이러한 유형을 구현하기 위해 해시 테이블을 사용하며 그 순서는 삽입 및 삭제 기록과 랜덤 해시 시드에 따라 달라집니다.Python 3.5 이상 버전에서는 사전에도 적용됩니다.
참고: 기본적으로
__hash__()
str, 및 할 수 없는 value.str, bytes 및 datetime 객 결 측 salted 됩 할 " 정 " 다 " 니 " 로 " 으 의 " 임 " 는 " 의 " 없 " 체 " 수 " 의 " 은 " 예 " 값 " " " ▁" " ▁values " ▁with "개별 Python 프로세스 내에서 일정하게 유지되지만 반복적인 Python 호출 간에는 예측할 수 없습니다.이는 딕트 삽입의 최악의 성능인 O(n^2) 복잡성을 이용하는 신중하게 선택된 입력에 의해 야기되는 서비스 거부에 대한 보호를 제공하기 위한 것입니다.자세한 내용은 http://www.ocert.org/advisories/ocert-2011-003.html 을 참조하십시오.
해시 값을 변경하면 딕트, 세트 및 기타 매핑의 반복 순서에 영향을 미칩니다.Python은 이 주문에 대해 보증한 적이 없으며 일반적으로 32비트와 64비트 빌드 사이에서 다릅니다.
참고 항목
PYTHONHASHSEED
.
안정적인 해시 구현이 필요한 경우 모듈을 살펴보고 암호화 해시 기능을 구현합니다.피블룸 프로젝트는 이 접근 방식을 사용합니다.
오프셋은 접두사와 접미사(각각 시작 값과 최종 XORed 값)로 구성되므로 오프셋만 저장할 수는 없습니다.이는 공격자가 타이밍 공격으로 오프셋을 쉽게 결정할 수 없다는 것을 의미합니다.
의 이러한 동작hash()
세션 간에 데이터베이스에 저장된 레코드를 비교하려고 할 때 트립되었습니다.
그PYTHONHASHSEED
환경 변수 설정과 관계없이 안정적으로 작동하기 위해 프로그램이 필요했기 때문에 솔루션이 너무 복잡했습니다.
그래서 저는 문자열을 해시하고(어떤 것이든 문자열로 변환하기 쉽다) 32비트 양의 정수를 해시로 생성하는 단순한 함수를 만들었습니다.암호화된 안전한 해시는 아니지만 빠른 비교에 충분합니다.
def myHash(text:str):
hash=0
for ch in text:
hash = ( hash*281 ^ ord(ch)*997) & 0xFFFFFFFF
return hash
곱셈의 숫자는 비트를 섞기 위해 임의로 선택된 소수일 뿐입니다.
해시를 16진수 문자열로 만들려면 마지막 줄을 다음으로 바꿀 수 있습니다.
return hex(hash)[2:].upper().zfill(8)
해시 랜덤화는 Python 3에서 기본적으로 설정되어 있습니다.다음은 보안 기능입니다.
해시 랜덤화는 딕트 구성의 최악의 성능을 이용하는 신중하게 선택된 입력으로 인해 발생하는 서비스 거부에 대한 보호를 제공하기 위한 것입니다.
2.6.8 이전 버전에서는 명령줄에서 -R을 사용하거나 PYONHASHSEED 환경 옵션을 사용하여 스위치를 켤 수 있었습니다.
설정하여 끌 수 있습니다.PYTHONHASHSEED
영점까지
언급URL : https://stackoverflow.com/questions/27522626/hash-function-in-python-3-3-returns-different-results-between-sessions
'itsource' 카테고리의 다른 글
안드로이드 8.0: java.lang.잘못된 상태 예외:서비스를 시작할 수 없습니다. (0) | 2023.06.11 |
---|---|
게시물을 게시된 순서대로 내림차순으로 표시 (0) | 2023.06.11 |
기본 앱을 생성할 때 FirebaseOptions는 null일 수 없습니다. (0) | 2023.06.06 |
오류: nodejs의 첫 번째 인증서를 확인할 수 없습니다. (0) | 2023.06.06 |
안드로이드에서 '콘텍스트'를 얻는 정적인 방법? (0) | 2023.06.06 |