데이터의 지문
해시 함수는 어떤 입력(단어 하나, 문서 하나, 4 GB 동영상)이든 정해진 길이의 짧은 문자열로 바꿉니다. 이것을 해시, 다이제스트, 체크섬이라고 부릅니다. 같은 입력에서는 늘 같은 해시가 나오고, 아주 조금만 바꿔도 완전히 다른 해시가 됩니다.
| 입력 | SHA-256 해시 |
hello | 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 |
Hello | 185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969 |
hello! | ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b |
대문자 하나나 느낌표 하나로 결과의 글자가 모두 바뀝니다. 해시 생성기에서 직접 해 보세요.
좋은 해시 함수의 조건
- 결정적: 같은 입력이면 어느 컴퓨터에서든 같은 해시가 나옵니다.
- 한 방향: 해시에서 입력으로 되돌아갈 수 없습니다.
- 충돌 저항: 같은 해시가 나오는 서로 다른 두 입력을 찾는 것이 사실상 불가능해야 합니다.
- 빠른 계산: 체크섬에는 편리하지만, 바로 이것이 빠른 해시를 비밀번호에 쓰면 안 되는 이유이기도 합니다(뒤에서 설명).
해시는 암호화가 아니다
암호화는 양방향이라 키가 있으면 되돌릴 수 있습니다. 해시에는 키가 없고 되돌릴 수 없습니다. 알 수 있는 것은 일치하는지 여부뿐입니다. Base64는 또 다른 것으로, 누구나 디코딩할 수 있는 단순한 인코딩입니다.
자주 쓰는 알고리즘
| 알고리즘 | 길이 | 상태 |
| MD5 | 128비트(16진수 32자) | 2004년부터 깨짐. 우연한 손상 확인에만 |
| SHA-1 | 160비트(16진수 40자) | 깨짐. 2017년에 첫 실제 충돌 공개 |
| SHA-256 | 256비트(16진수 64자) | 안전. 현재 표준 |
| SHA-512 | 512비트(16진수 128자) | 안전. 64비트 컴퓨터에서는 SHA-256보다 빠른 경우가 많음 |
각각으로 hello를 해시하면:
- MD5:
5d41402abc4b2a76b9719d911017c592 - SHA-1:
aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d - SHA-256:
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
MD5와 SHA-1이 "깨졌다"는 뜻
MD5와 SHA-1에서는 연구자가 같은 해시가 나오는 서로 다른 파일 두 개를 일부러 만들 수 있습니다. 공격자가 무해한 파일을 체크섬이 같은 해로운 파일로 바꿔치기하거나, 서명된 문서를 위조할 수 있다는 뜻입니다. 둘 다 되돌릴 수는 없고, 우연한 손상이라면 해시가 바뀌므로 MD5 체크섬으로도 다운로드 실패는 찾을 수 있습니다. 다만 아무도 파일을 조작하지 않았다는 증명은 되지 않습니다.
SHA-256과 SHA-512는 2001년에 공개된 SHA-2 계열이며, 알려진 실용적인 공격이 없습니다. 2015년에 표준화된 SHA-3는 다른 설계로, 예비용으로 마련되어 있습니다.
해시의 쓰임새
- 다운로드 확인: 개발사가 파일의 SHA-256을 공개하고, 내 것과 일치하면 같은 파일입니다. 체크섬 확인하는 방법을 보세요.
- 전자 서명과 HTTPS 인증서: 문서나 인증서의 해시를 구하고, 그 해시에 서명합니다.
- Git: 커밋과 파일은 해시로 식별됩니다. Git은 오래 SHA-1을 써 왔지만, 지금은 SHA-256도 지원합니다.
- 비트코인 등 블록체인: 블록은 SHA-256으로 이어져 있습니다.
- 중복 파일 찾기: SHA-256이 같은 두 파일은 같은 파일입니다.
해시와 비밀번호
사이트는 비밀번호 자체가 아니라 그 해시만 저장해야 합니다. 로그인할 때는 입력한 것을 해시해서 비교합니다. 다만 SHA-256은 이 용도에 맞지 않습니다. 너무 빨라서 유출된 데이터베이스를 가진 공격자가 초당 수십억 번 추측할 수 있기 때문입니다. 비밀번호에는 bcrypt, scrypt, Argon2처럼 그 목적으로 만든, 솔트를 쓰는 느린 해시가 필요합니다. 솔트는 해시하기 전에 각 비밀번호에 더하는 무작위 값으로, 같은 비밀번호를 쓰는 두 사람도 해시가 달라집니다.
직접 해 보기
해시 생성기라면 텍스트나 파일의 MD5, SHA-1, SHA-256, SHA-384, SHA-512를 브라우저 안에서 한 번에 계산하고, 공개된 체크섬과 비교할 수 있습니다.