개발자 도구 · SHA 해시 계산기
길이 확장 공격: SHA-256(비밀 + 메시지)가 MAC이 아닌 이유
· 그것이 중요한 이유
샤-256 암호화 보안
메시지 앞에 비밀을 추가하고 해싱하는 것은 인증처럼 보이지만 SHA-256의 구조로 인해 공격자가 비밀을 알지 못한 채 메시지를 확장할 수 있습니다. 이 게시물에서는 공격과 수정 사항에 대해 설명합니다.
직접 만든 요청 서명 — 해시(비밀 + 본문) 및 안전하다고 느끼는 이유
개발자는 메시지 인증이 필요하지만 HMAC 지식이 부족하여 비밀을 메시지와 연결하고 결과를 해시합니다. 이 접근 방식은 처음에는 안전해 보입니다. 출력은 누군가가 메시지를 수정하면 변경되어야 하는 고정 크기 지문입니다. 그러나 SHA-256에는 공격자가 비밀을 알지 못한 채 메시지에 데이터를 추가하고 유효한 다이제스트를 계산할 수 있게 하는 길이 확장이라는 구조적 결함이 있습니다. ToolAcre SHA 해시 계산기는 키 인증이 아닌 일반 다이제스트만 계산합니다. 왜냐하면 이러한 구별이 실제 보안에 중요하기 때문입니다.
해싱 전에 비밀을 추가하는 것은 비밀 보유자만이 해시를 다시 계산할 수 있기 때문에 직관적으로 매력적입니다. 메시지가 변경되면 해시도 변경되므로 진위 증명처럼 보입니다. API는 공유 암호와 요청 본문을 연결한 다음 결과를 해시하고 해당 해시를 요청에 포함하여 요청에 서명할 수 있습니다. 서버는 본문을 수신하고, 비밀의 복사본으로 해시를 다시 계산하고, 일치하는지 확인합니다. 공격자가 본문을 변경하면 해시가 일치하지 않으므로 개발자는 그렇게 생각합니다.
Merkle–Damgård의 상태 유출 — 최종 다이제스트는 내부 상태이므로 공격자는 사용자가 중지한 지점부터 해싱을 계속할 수 있습니다.
SHA-256는 Merkle–Damgård 해시 함수라는 계열에 속합니다. 이러한 함수는 고정 크기 블록의 입력을 처리하고 이전 상태와 현재 블록을 가져와 새 상태를 출력하는 압축 함수를 연결합니다. 압축 기능은 내부의 유일한 암호화 기본 요소입니다. 체인 전략과 패딩 방식이 전체 건설 작업을 수행합니다. 최종 다이제스트는 단순히 16진수로 인쇄된 최종 상태입니다. 이것은 부수적인 것이 아닙니다. 출력은 내부 상태입니다. 다이제스트를 보는 사람은 누구나 해당 지점에서 해싱을 계속하는 데 필요한 정확한 상태를 갖게 됩니다.
메시지를 확장하기 위해 공격자는 관찰된 secret + original_message 다이제스트에서 시작하여 이를 새 압축 함수 호출에 대한 상태 변수로 처리합니다. 추가하려는 데이터를 추가하고 전체 새 메시지 길이에 맞게 올바르게 채운 다음 다이제스트를 계산합니다. 서버가 자신의 비밀과 해싱을 추가하여 이 위조된 다이제스트를 검증할 때 계산은 초기 비밀이 흡수된 후 공격자의 계산과 동일하게 진행됩니다. 서버는 동일한 다이제스트를 계산하고 공격자가 비밀을 전혀 알지 못한 채 위조된 메시지를 수락합니다.
확장 작동 방식 — 긴 메시지에 대한 유효한 해시를 위조하기 위해 패딩 및 추가 데이터 추가
다양한 알고리즘은 길이 확장에 따라 다르게 영향을 받습니다. SHA-1은 취약합니다. 공격자가 SHA-1 다이제스트를 관찰하고 메시지를 확장할 수 있습니다. SHA-256도 똑같은 방식으로 취약합니다. SHA-512은(는) 확장 공격에도 취약합니다. SHA-384는 384 비트로 잘린 SHA-512로 구성되므로 길이 확장에 저항합니다. 압축 함수 출력은 게시된 다이제스트보다 길기 때문에 공격자는 해싱을 계속할 만큼 충분한 정보를 갖고 있지 않습니다. SHA-3에 사용된 스폰지 구조도 내부 상태가 누출되지 않기 때문에 저항합니다.
어떤 알고리즘이 취약한지 이해하려면 압축 함수 크기와 게시된 다이제스트 크기에 대해 알아야 합니다. SHA-256은 256 비트를 게시하고 압축 기능 상태도 256 비트이므로 다이제스트는 전체 상태입니다. 공격자는 계속하는 데 필요한 모든 것을 갖추고 있습니다. SHA-384은 384 비트를 게시하지만 SHA-384은 SHA-512 위에 구축되었기 때문에 기본 압축 함수 상태는 512비트입니다. 다이제스트는 512 비트 중 384만 공개하므로 128 비트는 공격자가 알 수 없습니다. 이는 이러한 저항을 제공하는 SHA-384의 의도적인 설계 속성입니다.
지원되는 SHA-1, SHA-256 및 SHA-512 구성은 전체 상태를 노출합니다. SHA-384 잘림으로 인해 확장 경계가 변경됩니다.
공유 비밀을 사용하여 메시지를 인증하기 위한 수정 사항은 키 해시 메시지 인증 코드인 HMAC입니다. HMAC는 비밀과 해시를 앞에 추가하지 않습니다. 대신 내부 및 외부 패드라고 하는 특정 패딩 구성표를 사용하여 두 개의 중첩된 해시 작업에 비밀을 적용합니다. 구성은 HMAC(비밀, 메시지) = SHA256(secret_XOR_outer_pad, SHA256(secret_XOR_inner_pad, 메시지))입니다. 이 중첩 접근 방식은 공격자가 내부 해시의 다이제스트를 가지고 있더라도 비밀 없이 해싱을 계속할 수 없기 때문에 길이 확장 간격을 줄입니다.
다이제스트와 HMAC 작업을 별도로 유지하는 이유는 두 작업을 서로 바꿔서 처리하는 일반적인 실수를 피하기 위한 것입니다. 두 가지 기능을 모두 수행하는 도구를 통해 해싱에 대해 배우는 개발자는 코드를 작성할 때 어떤 도구를 사용하고 있는지 잊어버릴 수 있습니다. 다이제스트 계산을 별도로 유지하면 선택이 명확해지고 인증에 HMAC 또는 서명이 필요하다는 학습이 강화됩니다. ToolAcre SHA 해시 계산기는 일반 다이제스트에 명확하게 레이블을 지정하고 문서에서는 HMAC가 완전히 다른 작업이라고 설명합니다.
수정 사항으로서의 HMAC — 격차를 줄이는 중첩 구조와 이것이 표준 답변인 이유
길이 확장의 개념적 예는 익숙한 테스트 벡터 abc에서 작동합니다. ASCII 텍스트 abc에 대해 SHA-256을 계산하면 다이제스트 ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad가 생성됩니다. 이 다이제스트가 5바이트 비밀로 해시된 secret + abc의 결과이고 총 8바이트의 입력을 제공한다고 가정합니다. SHA-256는 64바이트 블록의 입력을 처리하므로 첫 번째이자 유일한 블록은 메시지 길이와 기타 패딩 바이트로 채워졌습니다. 공격자는 다이제스트를 보고 abc로 시작하고 뒤에 추가 데이터가 오는 메시지를 위조하려고 합니다.
해시 내부에 추가된 정확한 패딩을 모르기 때문에 abc에 직접 추가할 수 없습니다. 그러나 전체 패딩된 메시지는 abc와 64바이트 블록에 대한 8바이트 입력에 필요한 패딩이 무엇인지 계산할 수 있습니다. 그런 다음 추가 데이터를 추가하고, 새로운 총 길이에 대한 패딩을 계산하고, 관찰된 다이제스트를 시작 상태로 처리하여 조합을 해시합니다. 결과는 서버가 비밀을 추가하고 동일한 해시를 계산하기 때문에 허용하는 유효한 SHA-256 다이제스트입니다.
작업된 예 — 라이브 대상 없이 서명된 메시지를 확장하는 개념적 연습
실제 시스템에서 이러한 공격을 방지하려면 개발자는 일반 해시에서 인증을 구축하려고 시도해서는 안 됩니다. HMAC가 표준 답변이며 ToolAcre SHA 해시 계산기는 무결성 검사, 콘텐츠 해싱 및 이와 유사한 비인증 목적을 위한 일반 다이제스트를 계산하는 도구입니다. 일반 SHA-256 다이제스트를 안전하게 사용하는 예로는 공격자가 파일과 다이제스트를 모두 제어할 수 없는 파일 체크섬이 있습니다. 해시가 조회 키인 콘텐츠 주소 지정 가능 스토리지 서명과 결합된 디지털 서명(서명이 인증을 제공함).
이 문제의 전체 범위에는 브라우저가 제공하는 다른 알고리즘이 포함됩니다. SHA-1은(는) 길이 확장에 취약하며 관련되기 전에 이미 암호화되어 있었습니다. ToolAcre 계산기는 SHA-1을 레거시 전용으로 표시하고 새로운 응용 프로그램에 적합하지 않게 만든 충돌 공격에 대해 설명합니다. 새로운 애플리케이션의 경우 SHA-256는 일반 다이제스트에 대한 합리적인 선택이며, 인증이 필요한 경우 SHA-256을 사용하는 HMAC가 답입니다. SHA-384 및 SHA-512는 모두 취약하지만 SHA-384은 잘림으로 보호됩니다.
여기서 다루지 않는 내용 — ToolAcre 계산기는 HMAC가 아닌 일반 다이제스트를 계산합니다. 게시물에서는 이러한 차이가 중요한 이유를 설명합니다.
해시 함수의 정신 모델을 구축할 때 Merkle–Damgård 구성 및 길이 확장이 핵심 개념이 됩니다. 해시 함수는 임의의 입력 길이를 처리하고 고정된 출력을 생성해야 합니다. 이를 수행하는 방법은 압축 기능을 블록별로 연결하는 것이며 최종 상태가 출력으로 변환되는 방식은 엄청나게 중요합니다. 최종 상태가 완전히 출력되면 해당 출력에는 해싱을 계속하는 데 필요한 모든 정보가 포함됩니다. 최종 상태가 잘리면 일부가 숨겨집니다.
길이 확장 공격에 대해 처음 읽는 개발자의 경우 문제는 해당 공격이 자신의 사용 사례에 영향을 미치는지 어떻게 알 수 있느냐입니다. 해시에 대한 입력이 공개 상수이고 해시가 조회 키 또는 지문으로 사용되는 경우 길이 확장은 관련이 없습니다. 양측이 비밀을 공유할 때 해시가 메시지를 인증하는 데 사용되는 경우 길이 확장은 심각한 취약점이며 HMAC가 해결책입니다. ToolAcre SHA 해시 계산기는 다이제스트 및 바이트 수를 표시하여 이것이 인증 메커니즘이 아닌 계산 출력임을 명확하게 보여줍니다.
요약: 인증을 위해 MAC를 사용합니다. ToolAcre SHA 해시 계산기는 무결성 다이제스트를 위한 것입니다. 인증에는 HMAC 또는 서명이 필요합니다
이를 프로덕션 시스템에 적용하면 원칙은 간단합니다. 즉, 비밀이 관련된 경우 인증에 베어 해시를 사용하지 마십시오. HMAC는 길이 확장 공격 벡터를 완전히 차단하는 표준 구성입니다. SHA-256 및 SHA-384은 모두 올바르게 사용하면 의도한 목적에 맞게 안전합니다. Merkle–Damgård가 다이제스트에 상태를 공개하고, SHA-384가 상태의 일부를 숨기기 위해 잘리고, HMAC가 중첩 구성을 사용하여 확장을 방지한다는 세 가지 핵심 사항을 이해하면 개발자가 올바른 선택을 할 수 있는 도구를 얻을 수 있습니다.
ToolAcre SHA 해시 계산기는 이러한 가르침을 구현합니다. 학습 및 합법적인 비인증 사용을 위한 일반 다이제스트를 제공하고 SHA-1을 레거시로 표시하며 해당 작업이 다른 컨텍스트에 속하기 때문에 HMAC를 구현하지 않습니다. 개발자가 요청을 인증하기 위해 일반 해시 계산기를 사용하는 경우 도구의 위치 지정 및 문서는 개발자를 적절한 도구인 HMAC 및 서명으로 안내합니다. ToolAcre 툴킷은 브라우저의 Web Crypto가 직접 제공하는 것에 초점을 맞추고 각 기본 요소가 적합한 경계를 설명합니다.