복붙노트

[PYTHON] 파이썬 3.3의 해시 함수는 세션간에 다른 결과를 반환합니다.

PYTHON

파이썬 3.3의 해시 함수는 세션간에 다른 결과를 반환합니다.

파이썬 3.3에서 BloomFilter를 구현했고, 매회 다른 결과를 얻었다. 이 괴괴 망측 한 행동을 조사하면 내부 hash () 함수가 생겼다. 매 세션마다 동일한 문자열에 대해 다른 해시 값을 반환한다.

예:

>>> hash("235")
-310569535015251310

----- 새로운 파이썬 콘솔 열기 -----

>>> hash("235")
-1900164331622581997

왜 이런 일이 일어나는 걸까요? 왜 이것이 유용한가요?

해결법

  1. ==============================

    1.파이썬은 임의의 해시 시드를 사용하여 공격자가 충돌하도록 설계된 키를 보내어 애플리케이션을 공격하지 못하게합니다. 최초의 취약점 공개를 참조하십시오. 해시를 임의 시드 (시동시 한 번 설정)로 오프셋함으로써 공격자는 더 이상 충돌 할 키를 예측할 수 없습니다.

    파이썬은 임의의 해시 시드를 사용하여 공격자가 충돌하도록 설계된 키를 보내어 애플리케이션을 공격하지 못하게합니다. 최초의 취약점 공개를 참조하십시오. 해시를 임의 시드 (시동시 한 번 설정)로 오프셋함으로써 공격자는 더 이상 충돌 할 키를 예측할 수 없습니다.

    PYTHONHASHSEED 환경 변수를 설정하여 고정 시드를 설정하거나 기능을 사용하지 않도록 설정할 수 있습니다. 기본값은 무작위이지만 고정 된 양의 정수 값으로 설정할 수 있습니다.이 값을 0으로 설정하면 기능이 모두 비활성화됩니다.

    파이썬 버전 2.7과 3.2는이 기능이 기본적으로 비활성화되어 있습니다 (-R 스위치를 사용하거나 활성화하려면 PYTHONHASHSEED = random을 설정하십시오). 이것은 파이썬 3.3 이상에서 기본적으로 사용 가능합니다.

    파이썬 사전이나 세트의 키 순서에 의존한다면 그렇게하지 마십시오. 파이썬은 해시 테이블을 사용하여 이러한 유형을 구현하며 순서는 삽입 및 삭제 기록과 무작위 해시 시드에 따라 다릅니다.

    또한 객체 참조 .__ hash __ () 특수 메소드 문서화 :

    안정적인 해시 구현이 필요한 경우 hashlib 모듈을보고 싶을 것입니다. 이것은 암호화 해시 함수를 구현합니다. pybloom 프로젝트는이 방법을 사용합니다.

    오프셋은 접두사와 접미사 (각각 시작 값과 최종 XOR 된 값)로 구성되기 때문에 불행히도 오프셋을 저장할 수 없습니다. 더하기 측면에서, 이것은 공격자가 타이밍 공격으로 오프셋을 쉽게 결정할 수 없음을 의미합니다.

  2. ==============================

    2.해시 임의 화는 기본적으로 Python 3에서 켜져 있습니다. 이것은 보안 기능입니다.

    해시 임의 화는 기본적으로 Python 3에서 켜져 있습니다. 이것은 보안 기능입니다.

    2.6.8 이전 버전에서는 명령 줄에서 -R 또는 PYTHONHASHSEED 환경 옵션을 사용하여 전환 할 수있었습니다.

    PYTHONHASHSEED를 0으로 설정하여 스위치를 끌 수 있습니다.

  3. ==============================

    3.hash ()는 파이썬 내장 함수이며 string 또는 num이 아닌 object의 해시 값을 계산할 때 사용합니다.

    hash ()는 파이썬 내장 함수이며 string 또는 num이 아닌 object의 해시 값을 계산할 때 사용합니다.

    이 페이지에서 세부 정보를 볼 수 있습니다 (https://docs.python.org/3.3/library/functions.html#hash).

    및 hash () 값은 개체의 __hash__ 메서드에서 가져옵니다. 의사는 다음과 같이 말합니다 :

    그래서 다른 콘솔에서 같은 문자열에 대해 서로 다른 해시 값을 가질 수 있습니다.

    당신이 구현하는 것은 좋은 방법이 아닙니다.

    문자열 해시 값을 계산하려면 hashlib를 사용하십시오.

    hash ()는 문자열이 아닌 객체 해시 값을 가져 오는 것을 목표로합니다.

  4. from https://stackoverflow.com/questions/27522626/hash-function-in-python-3-3-returns-different-results-between-sessions by cc-by-sa and MIT license