사용 방법
- 텍스트를 입력하거나, ‘입력 형식’을 ‘16진수’로 바꾸어 바이트를 입력하거나, ‘파일 열기’로 파일을 엽니다.
- SHA-1이 미리 선택되어 있습니다. 다른 해시 함수와 비교하려면 ‘알고리즘’ 선택 상자에서 바꿉니다.
- ‘출력 형식’에서 ‘16진수(소문자)’, ‘16진수(대문자)’, ‘Base64’ 중 하나를 고릅니다. sha1sum과 Git은 소문자 16진수로 출력합니다.
- 예상 SHA-1 값을 ‘비교 대상’ 필드에 붙여넣으면 ‘일치’ 또는 ‘불일치’가 표시됩니다.
SHA-1이란 무엇입니까?
SHA-1(Secure Hash Algorithm 1)은 NSA가 설계하고 NIST가 1995년 FIPS 180-1로 발표한 해시 함수로, 잠깐 쓰이다 사라진 SHA-0을 대체했습니다. 현재는 FIPS 180-4에 규정되어 있으며, RFC 3174는 C 예제 코드와 함께 SHA-1을 설명합니다. SHA-1은 512비트 블록을 80라운드로 처리해 160비트 다이제스트를 출력합니다. 16진수로는 40자, Base64로는 28자입니다.
다른 모든 해시처럼 SHA-1도 단방향입니다. 다이제스트는 복호화할 수 없으며, 추측한 값을 해시해서 맞춰 보는 수밖에 없습니다. 2012년 LinkedIn에서 유출된, 솔트 없는 SHA-1 비밀번호 해시가 대량으로 크래킹된 것도 이런 방식이었습니다. 비밀번호는 Argon2, scrypt, bcrypt, PBKDF2로 저장해야 합니다.
SHAttered: SHA-1을 더 이상 쓰지 않는 이유
2017년 2월 CWI Amsterdam과 Google의 연구자들은 최초의 실제 SHA-1 충돌인 SHAttered를 발표했습니다. 해시가 같은 서로 다른 PDF 파일 두 개로, 약 2^63번의 SHA-1 계산으로 찾아낸 것입니다. 2020년에는 Gaëtan Leurent와 Thomas Peyrin이 논문 "SHA-1 is a Shambles"에서 선택 접두사 충돌로 PGP 키의 SHA-1 서명을 위조하는 시연을 했으며, 그 비용은 자금력 있는 공격자라면 충분히 감당할 수 있는 수준이었습니다.
- 공개 CA는 2016년에 SHA-1 TLS 인증서 발급을 중단했고, 브라우저는 2017년 초부터 이 인증서를 신뢰하지 않습니다.
- NIST는 2013년부터 새 디지털 서명에 SHA-1을 쓰지 못하도록 했으며, 2030년 말까지 완전히 퇴출할 계획입니다.
- 대부분의 Git 저장소는 여전히 SHA-1로 객체를 식별하며, 충돌 시도를 감지하는 강화된 구현으로 계산합니다. Git은 SHA-256을 사용하는 저장소도 만들 수 있습니다.
충돌은 HMAC을 깨뜨리지 않으므로 HMAC-SHA1은 TOTP 코드와 오래된 웹훅 서명에서 아직도 쓰입니다. HMAC-SHA1은 HMAC 생성기로 계산할 수 있습니다. 새로 만드는 시스템에는 SHA-256을 선택하십시오.
Git 객체 ID, Base64, 문자 인코딩
Git blob ID는 파일만의 SHA-1이 아닙니다. Git은 blob, 공백 하나, 바이트 단위 크기, 0 바이트로 이루어진 헤더 뒤에 내용을 붙여 해시합니다. 여기서 같은 값을 얻으려면 ‘입력 형식’을 ‘16진수’로 바꾸고 헤더 바이트까지 포함하십시오. hello 뒤에 줄 바꿈 문자가 붙은 경우 16진수 입력은 626c6f6220360068656c6c6f0a입니다.
$ printf 'hello\n' | sha1sum
f572d396fae9206628714fb2ce00f72e94f2258f -
$ printf 'hello\n' | git hash-object --stdin
ce013625030ba8dba906f756967f9e9ca394464a
SHA-1은 보통 소문자 16진수로 표시합니다. Base64는 WebSocket 핸드셰이크에서 볼 수 있는데, Sec-WebSocket-Accept는 클라이언트 키에 고정 GUID를 붙인 값의 SHA-1을 Base64로 나타낸 것입니다. LDAP의 {SHA} 비밀번호 값에도 Base64가 쓰입니다. 해시는 바이트를 대상으로 한다는 점을 기억하십시오. 악센트 부호가 붙은 문자가 들어간 텍스트는 UTF-8과 Windows-1252에서 SHA-1이 서로 다릅니다.
명령줄과 코드에서 SHA-1 계산하기
sha1sum file.zip # Linux
shasum file.zip # macOS(SHA-1이 기본값)
certutil -hashfile file.zip SHA1 # Windows
Get-FileHash file.zip -Algorithm SHA1 # PowerShell
# Python
hashlib.sha1(data).hexdigest()
// Node.js
crypto.createHash('sha1').update(data).digest('hex')
이 페이지는 브라우저에 내장된 Web Crypto API로 SHA-1을 계산하므로 입력이 기기 밖으로 나가지 않습니다. ‘모든 알고리즘’ 표에는 같은 입력의 MD5, SHA-256, SHA-384, SHA-512, CRC 값이 표시됩니다.
예시
| 입력 (UTF-8) | SHA-1 |
|---|---|
Hello, World! | 0a0a9f2a6772942557ab5355d76af442f8f65e01 |
Base64.is | 6c667ee2efd2020349eed40efa07c26683f613c8 |
你好 | 440ee0853ad1e99f962b63e459ef992d7c211722 |
자주 묻는 질문
SHA-1은 아직 안전하게 쓸 수 있습니까?
SHA-1 충돌을 만들어 낼 수 있으므로, 서명이나 인증서처럼 공격자가 입력을 고르거나 조작할 수 있는 곳에서는 안전하지 않습니다. 우발적인 손상을 잡아내는 데는 여전히 쓸 수 있고, HMAC-SHA1은 충돌의 영향을 받지 않습니다. 새로 작업한다면 SHA-256이나 SHA-512를 사용하십시오.
SHA-1 해시를 되돌릴 수 있습니까?
아니요. 키도 없고 복호화도 없습니다. 조회 사이트는 흔한 단어와 유출된 비밀번호를 모아 둔 표에 이미 있는 입력만 찾아냅니다. 그래서 길고 무작위한 입력은 이런 사이트로부터 안전하지만 짧은 비밀번호는 그렇지 않습니다.
SHA-1 해시의 길이는 얼마입니까?
= 하나로 끝나는 28자입니다. RIPEMD-160도 길이가 같으며, MySQL 4.1 이상의 비밀번호 해시는 별표 뒤에 16진수 40자가 붙은 형태입니다. 해시 식별기는 주어진 문자열에 해당할 수 있는 후보를 보여 줍니다.공개된 SHA-1 값으로 파일을 확인하려면 어떻게 합니까?
파일을 연 다음 공개된 값을 ‘비교 대상’ 필드에 붙여넣으십시오. 대문자 16진수, 소문자 16진수, Base64를 모두 받으며, 페이지에 ‘일치’ 또는 ‘불일치’가 표시됩니다.
SHA-1과 SHA-256은 어떻게 다릅니까?
둘 다 NIST가 발표했지만, SHA-256은 더 새로운 SHA-2 계열에 속하고 출력이 256비트이며 알려진 실용적인 공격이 없습니다. SHA-1은 출력이 더 짧고 충돌 저항성이 깨졌습니다.