한국어

개발자 도구 · SHA 해시 계산기

SubtleCrypto.digest이 브라우저에서 SHA-256 해시를 계산하는 방법

· 작동 원리

샤-256 암호화 브라우저 API

UTF-8 bytes 브라우저 SHA-256 다이제스트를 입력하고 16진수로 종료
원본 ToolAcre 벡터 일러스트

모든 최신 브라우저는 기본적으로 Web Crypto를 통해 바이트를 해시할 수 있습니다. 이 게시물은 TextEncoder에서 crypto.subtle.digest을 거쳐 16진수 다이제스트로 이어지는 하나의 문자열을 따르고 각 단계의 제약 조건을 설명합니다.

npm 설치가 없는 해시 - 기본 다이제스트가 번들 라이브러리보다 나은 상황

해싱 패키지를 설치하거나 원격 해시 웹 사이트에 데이터를 게시하지 않고도 짧은 텍스트 값에 대한 다이제스트를 계산할 수 있습니다. 브라우저는 보안 출처에 crypto.subtle.digest을 노출합니다. 해시는 결정론적인 고정 길이의 바이트 지문입니다. 입력을 숨기거나 입력한 사람이 누구인지 증명하지 않습니다. ToolAcre는 직접 작성한 SHA 알고리즘을 제공하는 대신 브라우저 구현을 사용하고 탭에서 해시된 문자열을 유지합니다.

텍스트는 바이트가 아닙니다. 해싱하기 전에 TextEncoder를 사용하여 입력을 UTF-8로 인코딩하고 이 단계에서 답을 결정하는 이유

"café"라는 텍스트와 해시에 입력된 바이트는 동일한 종류의 개체가 아닙니다. TextEncoder는 문자열을 UTF-8 bytes(카페의 경우 63 61 66 C3 A9)에 매핑하는 반면, 순진한 Latin-1 변환은 최종 문자에 E9를 사용하고 다른 다이제스트를 생성합니다. 시각적으로 동일한 텍스트라도 다른 유니코드 정규화 형식을 가질 수 있습니다. JavaScript, CLI 및 서버에서 해시를 비교하기 전에 인코딩 및 정규화에 동의하십시오. ToolAcre의 텍스트 모드는 해싱 전에 UTF-8 변환을 명시적으로 수행합니다.

다이제스트 호출 — 알고리즘 이름과 ArrayBuffer가 포함된 crypto.subtle.digest 및 Promise를 반환하는 이유

crypto.subtle.digest("SHA-256", bytes)는 암호화 작업이 비동기식일 수 있으므로 Promise를 반환합니다. 출력을 읽기 전에 기다리십시오. 이 메서드는 스트리밍 반복자가 아닌 전체 입력 버퍼를 사용합니다. SHA-256은 입력 내용이 3자인지 300만자인지에 관계없이 256 bits(32 bytes)을 내보냅니다. 보안 컨텍스트 제한은 SubtleCrypto API에 HTTPS 또는 로컬 호스트가 필요하다는 것을 의미하며 도구는 대체 방법을 고안하는 대신 해당 호스트가 없다고 보고합니다.

ArrayBuffer에서 hex로 — 결과 바이트를 사람들이 인식하는 64자 문자열로 변환

Promise는 친숙한 16진수 문자열이 아닌 바이트의 ArrayBuffer로 확인됩니다. 각 바이트를 필요에 따라 앞에 0이 있는 2개의 16진수 문자로 변환하여 SHA-256에 대해 정확히 64개의 소문자를 생성합니다. 이 16진수 표현은 32 bytes의 길이를 두 배로 늘리지만 다이제스트를 변경하지는 않습니다. Base64는 동일한 32 bytes을 더 간결하게 표현할 수 있습니다. 비교는 알고리즘, 입력 인코딩 및 출력 표현이 일치하는지 확인한 후에만 의미가 있습니다.

실제 사례 — 짧은 문자열을 단계별로 해싱하여 각 단계의 바이트를 표시합니다.

ASCII 텍스트 abc의 경우 UTF-8은 바이트 61 62 63을 생성합니다. 정확한 바이트의 SHA-256은 ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad입니다. ToolAcre 및 또 다른 신뢰할 수 있는 해시 구현에서 이를 테스트합니다. abc를 abc로 변경하고 줄 바꿈을 하면 다른 결과가 나타납니다. 출력이 다른 경우 암호화 기본 요소를 의심하기 전에 숨겨진 공백과 바이트 인코딩을 검사하십시오. 표시된 다이제스트는 abc가 비밀이라는 주장이 아니라 재현 가능한 테스트 벡터입니다.

보안 컨텍스트 — crypto.subtle이 HTTPS 및 localhost에서만 사용 가능한 이유

crypto.subtle은 보안 컨텍스트 API입니다. 프로덕션 HTTPS 페이지와 localhost 개발 페이지는 일반적으로 이를 노출합니다. 일반적으로 안전하지 않은 원격 HTTP 페이지는 그렇지 않을 수 있습니다. 또한 이 도구에는 입력과 출력을 보관할 만큼 충분한 메모리가 필요합니다. Web Crypto를 사용할 수 없는 경우 검토되지 않은 JavaScript 해시로 자동 전환하면 보안에 민감한 결과가 다른 구현에 따라 달라집니다. 분명히 실패하고 대신 안전한 환경을 선택하십시오.

여기서 다루지 않는 내용 - 원샷 다이제스트 API가 제공하지 않는 HMAC(키 해싱) 및 매우 큰 입력의 증분 해싱

원샷 다이제스트 API는 대용량 파일에 대한 증분 해싱이 아닙니다. SHA-256은 비밀번호 저장 체계가 아닙니다. 빠른 무염화 해시를 사용하면 추측이 저렴해지기 때문에 비밀번호 저장에는 특별히 제작되고 염분화되었으며 의도적으로 비용이 많이 드는 KDF가 필요합니다. SHA-1은 레거시 상호 운용성을 위해 표시될 수 있지만 충돌 저항이 손상되어 새로운 무결성 또는 서명 시스템에 적합하지 않습니다. HMAC는 인증되지 않은 바이트를 소화하는 것과 동일한 작업이 아닌 키 인증입니다.

요약: 브라우저에는 이미 해시 기능이 있습니다. ToolAcre SHA 해시 계산기는 정확히 이 API를 사용하므로 출력은 브라우저 자체입니다.

브라우저는 이미 SHA-256을 제공합니다. 즉, 텍스트를 바이트로 인코딩하고 다이제스트를 기다린 다음 비교를 위해 결과 형식을 지정합니다. ToolAcre SHA 해시 계산기는 붙여넣은 텍스트의 경로를 따르고 SHA-1을 레거시 전용으로 표시합니다. 먼저 abc를 알려진 결과와 비교한 다음 바이트와 인코딩을 이해하는 실제 중요하지 않은 자료를 해시합니다.