# 해시와 체크섬 — MD5, SHA-1, SHA-256, SHA-512

받은 파일을 배포처가 적어 둔 숫자와 맞춰 봅니다. 어디로도 보내지 않고요.

> 어떤 파일이든 MD5, SHA-1, SHA-256, SHA-384, SHA-512를 계산해 다운로드 페이지에 적힌 체크섬과 맞춰 봅니다. 파일은 브라우저 안에서 읽고, 크기와 상관없이 업로드하지 않습니다.

이 페이지는 브라우저 안에서만 동작하는 대화형 도구입니다(https://abox.tools/ko/체크섬-확인/). 도구에 넘긴 어떤 것도 업로드되지 않습니다. 아래는 이 페이지가 도구에 대해 글로 설명하는 내용 전부입니다. 도구를 쓰려면 이 주소를 여세요.

## 파일은 **절대 업로드되지 않습니다**. 서버가 아예 없으니까요.

체크섬은 파일의 바이트를 놓고 하는 계산이고, 그 계산은 여기, 이 페이지 안에서, 여러분 기기의 프로세서가 합니다. 파일은 디스크에서 4메가바이트씩 읽고 각 조각은 세고 나면 곧바로 버립니다. 그러니 어디에도 파일 전체가 모이지 않습니다. 메모리에도 그렇고 서버에는 더더욱 그렇습니다. 애초에 이 페이지 건너편에는 파일을 받아 줄 서버 자체가 없습니다.

- ✗ 업로드 없음
- ✗ 크기 제한 없음
- ✓ 오프라인에서도 작동
- ✓ 오픈 소스
- ✓ 파일은 기기 밖으로 나가지 않음

## 체크섬으로 받은 파일을 확인하는 방법

1. **파일을 고릅니다.** 상자 위에 끌어다 놓거나 직접 선택하세요. 디스크에서 바로, 조각을 나눠 읽습니다. 그동안 아무것도 어디로도 가지 않고, 여기서부터는 못 한다는 크기도 없습니다.
2. **읽게 둡니다.** MD5와 SHA-256은 기본으로, 한 번 읽는 동안 함께 계산합니다. 막대에 어디까지 왔는지와 얼마나 빠른지가 나옵니다. 큰 디스크 이미지는 복사하는 데 걸리는 시간과 비슷합니다. 읽는 양이 같기 때문입니다.
3. **원래 값을 붙여 넣습니다.** 다운로드 페이지가 준 것을 형태 그대로 붙여 넣으면 됩니다. 16진수만 있어도 되고, `sha256sum` 출력 한 줄이어도 되고, `SHA256SUMS` 파일 전체여도 되고, script 태그에서 떼어 온 `integrity` 속성이어도 됩니다. 어떤 알고리즘인지는 길이로 정해지고, 해당 칸은 알아서 켜집니다.
4. **색이 아니라 문장을 읽습니다.** 그 체크섬이 가리키는 파일이 맞는지 페이지가 한 문장으로 말해 줍니다. 맞으면 바이트가 배포처가 잰 것과 똑같다는 뜻입니다. 맞지 않으면 다른 것이니, 열기 전에 다시 받는 편이 낫습니다.
5. **필요하면 체크섬을 챙겨 가세요.** 하나만 복사하거나, 전부 복사하거나, 작은 텍스트 파일로 저장할 수 있습니다. 저장은 명령줄 도구들이 쓰는, 알고리즘 이름을 앞에 붙인 형식입니다. 숫자와 함께 알고리즘 이름도 같이 갑니다.

## 자세한 설명

[체크섬으로 받은 파일을 확인하는 방법](https://abox.tools/ko/가이드/체크섬으로-다운로드-확인하기/): 윈도우, 맥, 리눅스나 브라우저에서 MD5, SHA-256 체크섬을 맞춰 보는 방법과 일치가 실제로 증명하는 것, 그리고 이 일 전체를 무의미하게 만드는 실수.

## 상자 속 다른 도구

- [비밀번호·패스프레이즈 생성기](https://abox.tools/ko/비밀번호-생성기/): 여기서, 본인 브라우저가 만듭니다. 어디로도 보내지 않고, 저장하지 않고, 기록도 남기지 않습니다.
- [JSON 포매터](https://abox.tools/ko/json-포맷터/): JSON, XML, HTML, CSS, YAML을 정렬하거나 변환합니다. 남의 서버에 붙여 넣는 것은 없습니다.
- [YAML → JSON 변환기](https://abox.tools/ko/yaml-json-변환/): 양쪽 방향 모두, 그리고 각 방향이 무엇을 치르는지도 말해 줍니다. 그 어느 것도 남의 서버에 붙여 넣지 않습니다.
- [XML 포맷터](https://abox.tools/ko/xml-포맷터/): 읽으라고 펼친 XML, 보내라고 납작하게 누른 XML, 그리고 양쪽으로 오가는 JSON 변환. 그 어느 것도 남의 서버에 붙여 넣지 않습니다.

## 자주 묻는 질문

### 제 파일이 어딘가로 업로드되나요?

아닙니다. 여러분의 브라우저가 디스크에서 읽고 여러분의 프로세서가 4메가바이트씩 계산합니다. 이 도구에는 서버 쪽이 없고, 페이지의 `Content-Security-Policy`에는 접속할 수 있는 주소가 모두 적혀 있습니다. 그중 우리 것은 없습니다. 네트워크를 끊어도 계속 작동합니다.

### 크기 제한이 있나요?

없습니다. 파일이 통째로 어딘가에 놓이지 않습니다. 조각으로 읽고 각 조각은 세고 나서 버리므로, 40기가바이트짜리 디스크 이미지도 텍스트 파일과 같은 몇 메가바이트의 메모리만 씁니다. 드는 것은 시간이고, 얼마나 드는지는 페이지가 진행하면서 알려 줍니다. \
\
알고리즘을 브라우저의 `crypto.subtle.digest`에 넘기지 않고 여기에 적어 둔 이유가 그것입니다. 그쪽이 더 빠르지만, 그 호출은 메시지 전체를 버퍼 하나로 받고 파일을 조각으로 건네줄 방법이 없습니다. 그것을 썼다면 확인할 수 있는 최대 파일 크기가 이 탭이 마침 얻은 메모리에 달려 있게 됩니다. 휴대전화라면 수백 메가바이트이고, 사람들이 가장 확인하고 싶어 하는 것은 디스크 이미지입니다.

### 체크섬이 맞았습니다. 정확히 무엇이 증명된 건가요?

디스크에 있는 바이트가, 누군가 그 숫자를 적을 때 앞에 두고 있던 바이트와 같다는 것입니다. 그뿐이고, 그 경계는 정확히 짚어 둘 만합니다. \
\
증명된 것은 다운로드가 중간에 끊기지 않았다는 것, 고장 난 디스크에 상하지 않았다는 것, 오는 길에 바꿔치기되지 않았다는 것입니다. 그 파일이 안전하다는 것은 **증명되지 않았습니다**. 배포하는 쪽은 악성코드도 똑같이 정확하게 잴 수 있으니까요. 그리고 체크섬이 파일과 같은 페이지에서 같은 연결로 왔다면 증명된 것은 아주 적습니다. 한쪽을 바꿀 수 있었던 사람은 다른 쪽도 바꿀 수 있었습니다. 체크섬이 가장 값어치를 하는 때는 파일과 다른 길로 도착했을 때입니다. 서명된 `SHA256SUMS` 파일, 배포판의 릴리스 공지, 두 번째 미러, 또는 이미 그 값을 알고 있는 패키지 관리자 같은 경우입니다.

### 맞지 않습니다. 이제 어떻게 하죠?

먼저 같은 곳에서 다시 받아 보세요. 끊겼거나 이어받은 전송이 압도적으로 흔한 원인이고, 두 번째 사본이면 대개 정리됩니다. \
\
두 번째 사본도 같은 값이 어긋난다면, 맞춰 보고 있는 줄이 맞는지 확인하세요. 릴리스 페이지에는 파일이 여럿 올라 있고, ARM 빌드의 체크섬이 x86 것과 맞는 일은 없습니다. 그다음 버전을 확인하세요. 그것까지 맞는데도 어긋난다면 그 파일은 열지 마세요. 다른 미러에서 받아 두 체크섬을 서로 비교해 보세요.

### 어느 것을 써야 하나요?

배포처가 공개한 것을 쓰면 됩니다. 상대의 숫자와 맞춰 보는 것이 목적이니, 상대 몫을 여러분이 고를 수는 없습니다. \
\
확인하는 쪽이 아니라 만드는 쪽이라면 SHA-256을 쓰세요. MD5와 SHA-1은 중요한 의미에서 깨졌습니다. 같은 값을 갖는 서로 다른 파일을 일부러 만들 수 있다는 뜻이고, MD5는 몇 시간, SHA-1은 감당할 만한 비용이면 됩니다. 사고에 대해 쓸모없어졌다는 말은 아닙니다. 중간에 끊긴 다운로드가 우연히 원본과 같은 값이 될 일은 없으니까요. 다만 아무도 손대지 않았다는 말은 이제 못 합니다. SHA-384와 SHA-512는 문제없고 실제로 더 낫지도 않습니다. 공개하는 프로젝트가 있어서 여기에 두었습니다.

### 깨졌다면서 MD5는 왜 있나요?

여전히 그것이 적혀 있기 때문입니다. 미러, 펌웨어 다운로드, 대학의 소프트웨어 페이지, 그리고 수많은 제조사 사이트가 이십 년 전에 MD5를 올려 두고 그 뒤로 페이지를 손대지 않았습니다. 계산을 거부하는 도구는 방문자가 실제로 들고 온 물음에 답하기를 거부하는 셈입니다. \
\
대신 할 수 있는 일은 그 답이 얼마만큼의 값어치인지 말해 주는 것이고, 체크박스 옆의 한 줄이 그 일을 합니다. 맞아떨어진 MD5는 지금도 망가진 다운로드를 걸러 냅니다. 일부러 손댄 것은 걸러 내지 못합니다.

### 비교 칸에는 어떤 형식을 붙여 넣을 수 있나요?

흔히 쓰이는 형식은 모두 되고, 어떤 것인지는 페이지가 알아서 가려냅니다. \
\
16진수만 있어도 되고 사이에 공백이 있어도 됩니다. 뒤에 파일 이름이 붙은 `md5sum`이나 `sha256sum`의 출력 한 줄도 됩니다. 마흔 줄짜리 `SHA256SUMS` 파일 전체도 되고, 그럴 때는 고른 파일의 이름이 적힌 줄이 쓰입니다. BSD 형식인 `SHA256 (disk.iso) = …`도 되고, `SHA-256: …`처럼 앞에 이름표가 붙어도 됩니다. subresource integrity 속성인 `sha384-…`도 되는데, 이것은 16진수가 아니라 base64라서 비교 전에 디코딩합니다. \
\
어떤 알고리즘인지는 길이에서 나옵니다. 16진수 32자면 MD5, 40자면 SHA-1, 64자면 SHA-256, 96자면 SHA-384, 128자면 SHA-512입니다. 길이가 같은 것은 둘도 없으니 고를 것도 없고 틀릴 것도 없습니다.

### sha256sum이나 certutil과 같은 값이 나오나요?

네, 바이트 하나까지 같습니다. 공개된 테스트 벡터가 있는 정확한 규격이고, 여기 있는 알고리즘은 모두 빌드할 때마다 그 벡터와 운영체제의 구현 양쪽에 대고 확인합니다. \
\
달라 보이는 것은 표기뿐입니다. 윈도우의 `certutil -hashfile`은 대문자에 공백을 넣어 찍고, 이 페이지는 소문자로 씁니다. 배포처가 거의 모두 쓰는 쪽이 소문자이기 때문입니다. 비교는 둘 다 무시하므로 certutil에서 복사한 값도 여기에 붙여 넣은 소문자 값과 맞습니다.

### 파일 두 개를 서로 맞춰 볼 수 있나요?

한 단계만 더 거치면 됩니다. 먼저 첫 번째 파일을 확인해 체크섬을 복사하고, 두 번째 파일을 고른 다음 그 체크섬을 칸에 붙여 넣으세요. 두 파일이 같으면 페이지가 그렇게 말해 줍니다. \
\
체크섬이 조용히 가장 강한 자리가 이 경우입니다. 백업 드라이브의 사본이 노트북에 있는 것과 정말 같은 파일인지, 둘 다 같은 크기와 같은 날짜를 내세우고 있을 때 판가름을 내 줍니다.

### 제 파일이 바뀌나요?

아닙니다. 이 도구는 읽기만 합니다. 나오는 파일도, 다시 인코딩하는 일도, 되써지는 것도 없습니다. 내려받을 수 있는 것은 체크섬을 적어 둔 작은 텍스트 파일 하나뿐입니다. 원본은 디스크에 그대로 있고, 탭을 닫으면 어떻게 되느냐는 물음에 대한 정직한 답도 같습니다.

### 무료인가요? 계정이 필요한가요?

무료이고 계정도, 로그인도, 체험 기간도 없습니다. 파일 크기 제한도, 몇 개를 확인하든 횟수 제한도 없습니다. 이 사이트에는 광고가 있고 그것이 비용을 댑니다. 광고에는 여러분의 파일에 대해 아무것도 주지 않습니다.

### 오프라인에서도 되나요?

됩니다. 페이지를 한 번 불러온 다음 인터넷을 끊어도 그대로 작동합니다. 아무것도 업로드하지 않는다는 것을 확인하는 가장 간단한 방법이기도 합니다. 파일을 밖으로 보내 계산시키는 도구라면 선을 뽑는 순간 멈춥니다.

## 이 약속을 직접 확인하는 방법

- **여러분의 파일이 나갈 길이 없습니다.** Content-Security-Policy에 이 페이지가 접속할 수 있는 주소가 모두 적혀 있고, 그중 우리 것은 하나도 없습니다. 여러분의 파일이 모일 수 있는 엔드포인트가 여기에는 없고, 있다 한들 그리로 보내는 코드도 없습니다. 예전에는 `connect-src 'none'`이라고 적혀 있었고 그것은 절대적이었습니다. 광고를 넣으면서 그만큼을 내주었고, 그렇게 말하는 것까지가 약속입니다.
- **파일이 통째로 어딘가에 놓이는 일은 어떤 크기에서도 없습니다.** 4메가바이트씩 읽고, 읽은 조각은 진행 중인 상태에 넣은 뒤 버립니다. 그래서 이 페이지가 쓰는 메모리는 40기가바이트짜리 디스크 이미지든 텍스트 파일이든 똑같고, 여기서부터는 못 한다는 크기도 없습니다. 브라우저의 `crypto.subtle.digest`를 쓰지 않는 이유도 같습니다. 그 함수는 파일 전체를 한 번에 메모리에 요구하는데, 그것이 바로 이 도구가 갖지 않으려는 천장입니다.
- **다섯 가지 알고리즘, 이 저장소의 다섯 개 파일.** `src/md5.js`, `src/sha1.js`, `src/sha256.js`, `src/sha512.js`는 공개된 규격을 그대로 옮겨 적은 것이고, 각각 예순 줄 남짓입니다. 상수 표는 계산시키지 않고 적어 두었습니다. 결과가 브라우저에 좌우되지 않게 하려는 것입니다. 모두 빌드할 때마다 공식 테스트 벡터와 운영체제 자체의 구현 양쪽에 대고 확인합니다.
- **붙여 넣은 체크섬도 어디로 가지 않습니다.** 비교는 여기, 페이지 안에서, 여기서 계산한 값을 상대로 이루어집니다. 그 비교에 대해 아무도 알지 못합니다. 값도, 맞았는지도, 파일 이름도요. 들리는 것보다 무거운 이야기입니다. 체크섬에 파일 이름이 붙으면, 그것을 거둬 가는 쪽은 여러분이 방금 어떤 소프트웨어의 어떤 빌드를 받았는지 정확히 알게 됩니다.
- **구글이 불러오는 것과 구글에게 가지 않는 것.** 광고와 측정 스크립트는 구글에서 옵니다. 둘 중 어느 쪽도 여러분의 파일에 대해서는 아무것도 받지 않습니다. 파일도, 이름도, 크기도, 계산한 값 어느 것도 아닙니다. 바이트를 읽거나 처리하는 모든 줄은 이 도메인에서 오고 저장소에 들어 있습니다.
- **후원 버튼이 불러오는 것과 거기로 가지 않는 것.** 머리말의 “Buy me a coffee” 버튼은 cdnjs.buymeacoffee.com의 스크립트가 그리고 글자는 구글 폰트에서 가져옵니다. 링크일 뿐입니다. 방문을 알리지 않고, 여러분이나 여러분 파일에 대해 아무것도 받지 않습니다. 누르지 않는 한 아무 일도 없고, 눌러서 열리는 곳은 다른 사람의 사이트입니다.
- **오프라인에서도 작동합니다.** 네트워크를 끊어도 이 페이지의 모든 부분이 그대로 돌아갑니다. 가장 간단한 증거입니다. 파일을 밖으로 보내 계산시키는 도구라면 선을 뽑는 순간 멈춥니다.

**직접 확인해 보세요.** 위에 적은 어느 것도 그냥 믿으실 필요는 없습니다. 이 페이지는 저장소 안의 템플릿과 설정을 빌드 스크립트가 찍어 낸 결과이고, 그 스크립트는 누구나 읽고 직접 돌려 볼 수 있습니다. 결과물은 `dist` 브랜치에 그대로 올라가 있고요. 그래서 실제로 제공되는 파일과 소스를 빌드한 결과를 나란히 놓고 비교해 보실 수 있습니다: https://github.com/A-Box-of-Tools/website

먼저 읽어 볼 파일을 꼽자면, Content-Security-Policy는 `config/site.toml`, 네 가지 압축 함수는 `src/md5.js`, `src/sha1.js`, `src/sha256.js`, `src/sha512.js`, 함께 쓰는 패딩은 `src/blocks.js`, 파일을 조각으로 읽는 반복문은 `src/hash.js`입니다. 어느 파일에도 네트워크에 닿는 줄은 없습니다.
