Hash 함수
- 해시함수는 메시지 길이가 길던, 짧던 항상 동일한 길이의 메시지를 만들어내는 함수다.
- 메시지를 일정한 길이의 블록으로 분할 후 해시 함수에 입력한다.
- 짧고 일정한 길이의 메시지 다이제스트 (160,256,512bit)생성
- 대표적인 Hash함수 : MD5, SHA-256, SHA-512
1) Hash 함수의 요구사항
- 어떤 크기의 데이터 블록이든지 적용 가능해야 한다.
- 일방향성을 만족해야한다 = 메시지 다이제스트로부터 원래의 메시지를 만들어낼 수 없어야 한다. → 복호화 불가능
- 강한 충돌 회피성 : 다른 데이터에 의해 생성된 메시지 다이제스트는 동일하면 안된다.
2) SHA
SHA | 블럭 길이 | 다이제스트 길이 | 라운드 수 | 워드 크기 |
---|---|---|---|---|
SHA-1 | 512 | 160 | 80 | 32 |
SHA-256 | 512 | 256 | 64 | 32 |
SHA-512 | 1024 | 512 | 80 | 64 |
- 해시값은 데이터가 조금만 바뀌어도 완전히 다를 수 있다. → 눈사태 효과
sha = hashlib.new('sha256')
sha.update("love".encode("utf-8"))
print(sha.hexdigest()) # 686f746a95b6f836d7d70567c302c3f9ebb5ee0def3d1220ee9d4e9f34f5e131
sha.update("love.".encode("utf-8"))
print(sha.hexdigest()) # 1a89f4362e9bc0edcbe73cc8c9d9197a1c9542a8fa620c4a94daa40c7df7b756
점 하나로 다이제스트가 완전히 바뀐다.
- 아래와 같이 빈 문자열에도 해시값이 있다.
sha.update("".encode("utf-8"))
print(sha.hexdigest()) # 1a89f4362e9bc0edcbe73cc8c9d9197a1c9542a8fa620c4a94daa40c7df7b756
3) MD5
- 128비트 hash함수다.
- 다이제스트가 32비트의 길이로 SHA보다 짧다. 그래서 다이제스트가 겹치는 상황이 발생할 수 있다. → 그래서 현재는 사용하지 않는다.
- 이것을 비둘기 집의 원리라고 한다. n개의 집에 n+1마리의 비둘기가 들어간다면 한집에 두마리 이상 들어간 집이 적어도 하나는 있다.