SHA-256은 데이터에서 해시라고 하는 지문을 계산하는, 정확하게 정의된 절차입니다. 입력이 같으면 언제나 같은 256비트 결과가 나옵니다. 이는 32바이트이며, 보통 64개의 16진수 문자로 표시합니다. 비트코인은 데이터를 연결하고 검증할 때, 그리고 채굴에 이를 사용합니다. 하지만 지문은 원래 내용을 암호화한 사본이 아닙니다.
누군가 파일과 그 해시를 보내 줬다고 생각해 보세요. 직접 해시를 계산하면 내려받은 데이터가 제시된 지문과 맞는지 확인할 수 있습니다. 입력이 조금만 바뀌어도 매우 높은 확률로 결과 전체가 달라집니다. 그러나 지문만으로는 누가 파일을 만들었는지, 파일이 안전한지 알 수 없습니다. 공격자가 악성 파일과 그 해시를 함께 제공하면 둘은 일치합니다. 따라서 비교에 사용하는 기준값의 출처를 신뢰할 수 있는지도 중요합니다. [1] [5]
따옴표와 줄바꿈이 없는 세 ASCII 바이트 abc의 결과는 ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad입니다. 무작위로 생성한 숫자가 아닙니다. 올바른 구현이라면 정확히 같은 바이트에서 항상 이 결과가 나옵니다. 공백이나 줄바꿈을 넣으면 입력이 달라집니다. 이때 해시가 달라져도 알고리즘의 오류는 아닙니다. 텍스트의 인코딩도 중요합니다. [3]
암호화는 키를 사용해 메시지를 복원할 수 있도록 설계됩니다. SHA-256에는 그런 키도, 거꾸로 복원하는 절차도 없습니다. 다만 가능성 있는 입력을 추측해 볼 수는 있습니다. 네 자리 PIN을 해싱했다고 의심하는 사람은 10,000가지 조합을 모두 계산해 결과를 비교할 수 있습니다. 긴 해시를 만든다고 약한 비밀에 부족한 엔트로피 (입력을 예측하기 어려운 정도)가 생기지는 않습니다. 안전성은 공격자가 실제로 확인해야 할 후보가 얼마나 많은지에도 달려 있습니다. [5] [7]
블록 식별자, txid (거래 식별자), Merkle Tree (해시를 나무 구조로 연결한 것)에서 해시 쌍을 합치는 과정에는 SHA256(SHA256(data))가 쓰입니다. 두 번째 계산은 첫 결과의 원시 32바이트를 처리합니다. 이를 64개 문자로 적은 텍스트를 처리하는 것이 아닙니다. 출력은 여전히 256비트입니다. 이중 해싱은 여기서 정한 프로토콜 규칙이지, 한 번의 SHA-256이 깨졌다는 증거가 아닙니다. 비트코인은 다른 구성도 사용합니다. 예를 들어 Taproot는 해싱 용도를 구분하려고 입력에 미리 정한 태그를 덧붙입니다. [2] [4] [6]
채굴자는 후보 블록 헤더에서 변경이 허용된 항목을 반복해서 바꾸며 이중 SHA-256을 계산합니다. 결과를 숫자로 해석했을 때 정해진 target (수치상의 상한)을 넘지 않는 값을 찾는 것입니다. 메시지를 복호화하거나 다른 사람의 개인 키를 찾는 작업이 아닙니다. 적합한 헤더를 찾으려면 많은 시도가 필요하지만 검증은 빠릅니다. 헤더는 이전 블록도 가리키므로 오래된 블록을 바꾸면 뒤따르는 연결이 어긋납니다. Full Node (비트코인 규칙을 독립적으로 검증하는 노드)는 거래와 나머지 규칙도 확인합니다. 조건을 만족하는 해시만으로 잘못된 블록이 유효해지지는 않습니다. [4]
가능한 메시지의 수는 256비트 지문의 수보다 많습니다. 따라서 서로 다른 입력이 같은 해시를 갖는 경우가 반드시 있으며, 이를 충돌이라고 합니다. 중요한 것은 그런 경우를 의도적으로 찾을 수 있느냐입니다. 이상적인 256비트 해시에서 일반적인 방법으로 아무 충돌이나 찾으려면 대략 2^128번, 미리 정해진 지문에 맞는 입력을 찾으려면 대략 2^256번의 시도가 필요합니다. 둘은 다른 문제입니다. 충돌을 찾았다는 사실만으로 비트코인 개인 키가 드러나지는 않습니다. 이 숫자가 지갑이나 프로토콜 전체의 안전성을 보장하는 것도 아닙니다. [5]
SHA-256은 구성 요소이지 모든 보안 문제를 해결하는 완제품이 아닙니다. 의도적으로 빠르게 설계됐으므로 사람이 정한 비밀번호를 저장하는 데 단독으로 쓰기에는 적합하지 않습니다. 공격자도 추측을 빠르게 시험할 수 있기 때문입니다. 이런 목적에는 계산 비용을 조절할 수 있는 방식 등 전용 비밀번호 파생 절차가 있습니다. 마찬가지로 “무언가를 해싱하면 안전한 키가 된다”는 임의의 방법은 처음부터 부족했던 무작위성이나 입력 유출을 해결하지 못합니다. 사용자가 보통 SHA-256을 직접 계산할 필요는 없지만, 확인한 지문이 무엇을 입증하고 무엇은 입증하지 못하는지 알아야 합니다. [8] [7]
SHA-256은 SHA-2 계열이며 NIST FIPS 180-4에 절차가 정의되어 있습니다. 계산 전에 입력 길이 정보 등을 덧붙이고, 512비트 단위로 나누어 각각 64라운드 처리합니다. 이 내부 블록은 64바이트로, 비트코인 블록과는 다릅니다. 비트코인 블록 헤더는 80바이트이며 전체 블록에는 거래도 들어 있습니다. 이름의 256은 결과 지문의 길이를 뜻하며, 블록이나 개인 키의 크기를 뜻하지 않습니다. [1] [4]
더 정확히 이해하려면 이 항목과 함께 다음도 읽어 보세요 Hash, Proof of Work, Block Header, 비트코인 주소, Merkle Tree, Bitcoin. 다음 항목에서도 이 글을 참조합니다 Hash, ASIC Miner, Hashrate, Nonce.