해시 만들기

붙여넣은 글자의 해시를 냅니다. SHA 계열은 브라우저 기본 기능을 쓰고, MD5는 표준에 없어 직접 넣었습니다 — 안전하지 않아 빠졌지만 낡은 시스템의 값을 맞춰 봐야 하는 일이 현장에는 남아 있기 때문입니다.

넣은 것은 기기를 벗어나지 않습니다. 브라우저 안에서만 처리하고 어디에도 보내거나 저장하지 않습니다.

해시가 하는 일

얼마나 긴 글을 넣어도 정해진 길이의 값이 나옵니다 — MD5 는 16진수 32자, SHA-1 은 40자, SHA-256 은 64자, SHA-512 는 128자입니다. 같은 입력은 언제나 같은 값이고, 한 글자만 달라져도 값 전체가 바뀝니다. 값에서 원문으로는 되돌아갈 수 없어, 내려받은 파일이 그대로인지, 두 자료가 같은지, 캐시 키를 무엇으로 할지에 씁니다.

SHA 는 브라우저가, MD5 는 직접

SHA 계열은 crypto.subtle.digest 로 냅니다. 브라우저에 든 기능이라 정확하고 빠르지만 HTTPS 나 localhost 에서만 열립니다. MD5 는 표준에서 빠져 브라우저가 주지 않으므로 RFC 1321 대로 직접 구현했습니다. 낡은 시스템의 값을 맞춰 보려는 사람을 위해 남긴 것이고, 화면에서도 새로 쓰지 말라고 적어 둡니다. 열쇠를 섞는 HMAC 은 여기 없습니다.

해시는 글자가 아니라 바이트에서 나옵니다

입력을 UTF-8 로 바꾼 바이트를 해시합니다. 같은 글자라도 EUC-KR 이나 UTF-16 으로 저장된 파일과는 값이 다르고, 줄 끝이 \r\n 인 윈도 파일과 \n 인 파일도 다릅니다. 파일 머리에 BOM 세 바이트가 붙어 있으면 그것도 값에 들어갑니다. 다른 곳의 값과 어긋나면 글자가 아니라 이런 바이트를 먼저 의심하세요.

네 값이 한꺼번에, 소문자로

알고리즘을 고르지 않습니다. 한 번에 넷을 다 내어 나란히 보여 주므로, 어느 것으로 만든 값인지 모를 때는 길이를 견주면 됩니다. 값은 소문자 16진수입니다. 다른 도구가 대문자로 줬다면 글자만 다를 뿐 같은 값이니 대소문자를 무시하고 견주세요. 넣은 글은 손대지 않고 그대로 해시합니다 — 앞뒤 공백도, 붙여넣으며 딸려 온 마지막 줄바꿈도 값에 들어갑니다. 공백뿐인 입력은 처리하지 않습니다.

구현이 맞는지 확인하는 법

MD5 를 직접 넣었으니 의심이 들 수 있습니다. 예시로 둔 abc 는 규격 문서의 시험 벡터라, MD5 는 900150983cd24fb0d6963f7d28e17f72 가 나와야 하고 SHA-256 은 ba7816bf 로 시작해 f20015ad 로 끝나야 합니다. 다른 구현과 어긋나면 그쪽 입력에 보이지 않는 글자가 섞인 것부터 보세요.

자주 묻는 질문

MD5나 SHA-1을 써도 되나요?

새로 만드는 것에는 쓰지 마세요. 둘 다 같은 해시가 나오는 다른 입력을 만들어 낼 수 있다는 것이 이미 증명됐습니다. 비밀번호 저장에는 해시가 아니라 bcrypt·argon2 같은 전용 방식을 쓰세요. 기존 값을 대조하는 용도로만 남겨 두었습니다.

파일 해시도 되나요?

지금은 글자만 됩니다. 파일 체크섬이 필요하면 운영체제의 명령(shasum·certutil)을 쓰는 편이 빠릅니다.

비밀번호를 SHA 로 저장해도 되나요?

안 됩니다. SHA 는 빠르라고 만든 것이라 요즘 장비로는 초당 수십억 번을 시도할 수 있습니다. 비밀번호는 일부러 느린 bcrypt·scrypt·Argon2 같은 것으로, 사용자마다 다른 소금을 섞어 저장해야 합니다.

같은 글자를 넣었는데 값이 다릅니다.

보이지 않는 것이 섞인 경우입니다. 끝의 줄바꿈 하나, 눈에 안 보이는 공백 하나로도 값이 통째로 달라집니다. 파일의 해시와 견주는 중이라면 편집기가 저장할 때 끝에 줄바꿈을 넣었는지 보세요.

HMAC 이나 소금(salt)을 섞을 수 있나요?

없습니다. 소금은 글 앞이나 뒤에 직접 이어 붙여 넣으면 같은 값이 나오지만, HMAC 은 열쇠를 안팎으로 두 번 섞어 두 번 해시하는 다른 구조라 이어 붙이는 것으로는 만들 수 없습니다. 서명을 견줘야 하면 그 언어의 HMAC 함수를 쓰세요.

붙여넣은 코드가 서버로 가나요?

가지 않습니다. 브라우저 안에서만 처리하고 어디에도 보내거나 저장하지 않습니다. 사내 설정 파일이나 운영 쿼리처럼 밖으로 내보내기 곤란한 것도 그래서 쓸 수 있습니다. 인터넷을 끊고도 동작합니다.