SHA-256 해시 생성기
임의의 텍스트에서 SHA-256 해시 생성
입력 텍스트
SHA-256 해시
SHA-256 해시가 여기 표시됩니다…
SHA-256 해싱이란?
SHA-256(Secure Hash Algorithm 256-bit)은 NIST가 2001년 FIPS 180-2(이후 FIPS 180-4로 개정)의 일환으로 발표한 SHA-2 계열의 암호화 해시 함수입니다. 단일 문자, 수 기가바이트 파일, 빈 문자열 등 어떤 입력이든 SHA-256은 고정된 256비트(32바이트) 다이제스트를 생성하며, 일반적으로 64자리 16진수로 표시됩니다. SHA-256은 현재 프로덕션 시스템에서 가장 널리 사용되는 해시 함수로, TLS 인증서 체인, Bitcoin의 작업 증명, Subresource Integrity(SRI), 코드 서명 워크플로우의 기반이 됩니다.
SHA-256은 단방향 함수입니다. 입력에서 해시를 계산하는 것은 빠르지만(현대 하드웨어에서 초당 수백 메가바이트), 역과정 — 특정 해시를 생성하는 입력 찾기 — 은 계산적으로 불가능합니다. 사전 이미지 저항성이라 불리는 이 특성 덕분에 SHA-256은 비밀번호 해싱(솔트 및 키 스트레칭과 결합 시), 디지털 서명, 데이터 무결성 검증에 적합합니다. MD5 및 SHA-1과 달리, 완전한 SHA-256에 대한 충돌 또는 사전 이미지 공격은 아직 입증되지 않았습니다.
SHA-2 계열에는 SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256의 여섯 가지 변형이 포함됩니다. SHA-256은 블록당 64라운드의 32비트 워드로 동작하며 32비트 프로세서에 최적화되어 있습니다. SHA-512는 64비트 워드와 80라운드를 사용하여 64비트 플랫폼에서 더 빠를 수 있습니다. 256비트 다이제스트로 충분한 대부분의 애플리케이션에서 SHA-256은 NIST, IETF, CA/Browser Forum의 기본 권장 알고리즘으로 남아 있습니다.
온라인 SHA-256 생성기를 사용하는 이유
SHA-256 해시를 생성하려면 보통 터미널 명령어나 몇 줄의 코드가 필요합니다. 이 브라우저 기반 도구를 사용하면 아무것도 설치하지 않고, 컨텍스트를 전환하거나 스크립트를 작성하지 않고도 SHA-256 다이제스트를 계산할 수 있습니다.
SHA-256 활용 사례
SHA-2 계열 변형 비교
SHA-256은 FIPS 180-4에 정의된 SHA-2 계열에 속합니다. 각 변형은 다이제스트 크기, 성능 특성, 보안 마진 사이에서 균형을 맞춥니다. 아래 표는 자주 접하게 될 모든 SHA-2 변형을 비교합니다.
| 변형 | 다이제스트 크기 | 16진수 길이 | 바이트 크기 | 적합한 용도 |
|---|---|---|---|---|
| SHA-256 | 256 bits | 64 hex chars | 32 bytes | TLS, blockchain, code signing, JWTs, SRI |
| SHA-224 | 224 bits | 56 hex chars | 28 bytes | Truncated SHA-256 — rare, specific compliance |
| SHA-384 | 384 bits | 96 hex chars | 48 bytes | Government / CNSS, higher collision margin |
| SHA-512 | 512 bits | 128 hex chars | 64 bytes | Digital signatures, HMAC with large keys |
| SHA-512/256 | 256 bits | 64 hex chars | 32 bytes | SHA-512 speed on 64-bit CPUs, 256-bit output |
SHA-256 대 SHA-1 대 MD5 대 SHA-3
적합한 해시 알고리즘 선택은 보안 요구사항과 호환성 제약에 달려 있습니다. SHA-256은 실용적인 최적 지점을 차지합니다. 안전하고, Web Crypto API를 포함하여 광범위하게 지원되며, 대부분의 워크로드에 충분히 빠릅니다. 아래 비교 표는 해시 함수를 선택할 때 가장 중요한 속성들을 다룹니다.
| 속성 | SHA-256 | SHA-1 | MD5 | SHA-3-256 |
|---|---|---|---|---|
| Digest size | 256 bits (64 hex) | 160 bits (40 hex) | 128 bits (32 hex) | 256 bits (64 hex) |
| Security status | Secure | Broken (2017) | Broken (2004) | Secure |
| Collision resistance | 2^128 operations | Practical attack | Practical attack | 2^128 operations |
| Block size | 512 bits | 512 bits | 512 bits | 1600 bits (sponge) |
| Rounds | 64 | 80 | 64 | 24 |
| Standard | FIPS 180-4 | FIPS 180-4 | RFC 1321 | FIPS 202 |
| Web Crypto API | Yes | Yes | No | No |
| Primary use today | TLS, blockchain, SRI | Legacy git only | Non-security checksums | Backup standard |
SHA-256 내부 동작 원리
SHA-256은 Merkle-Damgård 구조를 통해 512비트(64바이트) 블록 단위로 입력을 처리합니다. 알고리즘은 처음 8개 소수의 제곱근의 소수 부분에서 파생된 8개의 32비트 상태 워드(H0–H7)를 초기화합니다. 각 블록은 비트 단위 연산(AND, XOR, NOT, 우회전, 우이동)과 처음 64개 소수의 세제곱근에서 파생된 64개의 라운드 상수를 사용하는 64라운드의 혼합 과정을 거칩니다.
SHA-256: b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
(256 bits = 32 bytes = 64 hex characters)
| 단계 | 설명 |
|---|---|
| Padding | Append a 1-bit, then zeros until the message length is 448 mod 512. Append the original message length as a 64-bit big-endian integer. |
| Block splitting | Divide the padded message into 512-bit (64-byte) blocks. |
| Message schedule | Expand each 16-word (32-bit) block into 64 words using sigma functions with right-rotate and right-shift operations. |
| Compression | Process 64 rounds per block using Ch, Maj, and two Sigma functions with 64 round constants derived from cube roots of the first 64 primes. |
| Output | Concatenate the eight 32-bit state words (H0-H7) into a 256-bit (32-byte) digest, rendered as 64 hexadecimal characters. |
눈사태 효과는 입력의 단일 비트를 반전시키면 출력 비트의 약 50%가 변경됨을 보장합니다. 2^128의 충돌 저항성과 결합된 이 특성이 바로 2026년에도 SHA-256이 보안 민감 애플리케이션의 기준 권장 알고리즘으로 남아 있는 이유입니다.
SHA-256 코드 예제
SHA-256은 모든 주요 언어와 런타임에서 네이티브로 사용할 수 있습니다. Web Crypto API는 라이브러리 없이 브라우저에서 제공합니다. 아래 예제는 유니코드 입력 처리와 파일 해싱을 포함한 실제 사용 패턴을 보여줍니다.
// Works in all modern browsers and Node.js 18+
async function sha256(text) {
const data = new TextEncoder().encode(text)
const hashBuffer = await crypto.subtle.digest('SHA-256', data)
const hashArray = Array.from(new Uint8Array(hashBuffer))
return hashArray.map(b => b.toString(16).padStart(2, '0')).join('')
}
await sha256('hello world')
// → "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9"
// Node.js (built-in crypto module)
const crypto = require('crypto')
crypto.createHash('sha256').update('hello world').digest('hex')
// → "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9"import hashlib
# Basic SHA-256 hash
result = hashlib.sha256(b'hello world').hexdigest()
print(result) # → "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9"
# Hash a string (encode to bytes first)
text = 'café ☕'
hashlib.sha256(text.encode('utf-8')).hexdigest()
# → "3eb53e00aa1bb4b1e8aab1ab38e56e6b8fb0b20e1cf7e1d19f36e4fad2537445"
# Hash a file in chunks (memory-efficient)
with open('release.tar.gz', 'rb') as f:
sha = hashlib.sha256()
for chunk in iter(lambda: f.read(8192), b''):
sha.update(chunk)
print(sha.hexdigest())package main
import (
"crypto/sha256"
"fmt"
)
func main() {
data := []byte("hello world")
hash := sha256.Sum256(data)
fmt.Printf("%x\n", hash)
// → b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
}# Using sha256sum (Linux) or shasum (macOS) echo -n "hello world" | sha256sum # → b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9 - # macOS echo -n "hello world" | shasum -a 256 # → b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9 - # Verify a file checksum echo "b94d27b... myfile.bin" | sha256sum -c # → myfile.bin: OK # Using openssl (cross-platform) echo -n "hello world" | openssl dgst -sha256 # → SHA2-256(stdin)= b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9