SHA-384 해시 생성기
임의의 텍스트에서 SHA-384 해시 생성
입력 텍스트
SHA-384 해시
SHA-384 해시가 여기에 표시됩니다…
SHA-384 해싱이란?
SHA-384는 NIST FIPS 180-4에 SHA-2 계열의 일부로 정의된 암호화 해시 함수입니다. 임의 길이의 입력을 받아 고정된 384비트(48바이트) 메시지 다이제스트를 생성하며, 일반적으로 96자리 16진수 문자열로 표시됩니다. SHA-384는 TLS 암호화 스위트, 디지털 인증서 서명, 그리고 SHA-256보다 높은 충돌 저항성 마진을 요구하는 정부 시스템에서 널리 사용됩니다.
내부적으로 SHA-384는 SHA-512의 잘린(truncated) 변형입니다. SHA-512와 동일한 1024비트 블록 크기, 80회 압축 라운드, 64비트 워드 연산을 사용하지만, 다른 초기 해시값 집합(9번째부터 16번째 소수에서 파생)으로 시작하고 최종 상태의 처음 384비트만 출력합니다. 이 잘림(truncation)으로 인해 동일한 입력이라도 SHA-384는 SHA-512와 다른 다이제스트를 생성합니다.
SHA-384는 64비트 워드로 동작하기 때문에 현대 64비트 프로세서에서 SHA-256보다 빠르게 실행되면서도 더 큰 다이제스트를 제공합니다. 이는 실용적인 중간 지점을 형성합니다. SHA-512의 128자리 16진수 출력에 따른 저장 부담 없이 SHA-256보다 강력한(192비트 충돌 저항성 대 128비트) 보안을 제공합니다. SHA-384는 TLS 1.3 인증서 검증 서명의 기본 해시이며, NSA Suite B(현재 CNSA)에서 최고 기밀 데이터에 요구됩니다.
온라인 SHA-384 생성기를 사용하는 이유
SHA-384 해시를 생성하려면 보통 터미널 명령어를 실행하거나 코드를 작성해야 합니다. 이 브라우저 기반 도구를 사용하면 아무것도 설치하거나 서버로 데이터를 전송하지 않고도 SHA-384 다이제스트를 즉시 계산할 수 있습니다. CDN 자산의 SRI 해시 생성, 파일 체크섬 검증, 동일 입력에 대한 SHA-384와 SHA-256 출력 비교 등 어떤 용도든, 이 도구는 모든 최신 브라우저에서 의존성 없이 SHA-384 다이제스트를 다룰 수 있는 즉각적인 방법을 제공합니다.
SHA-384 해시 생성기 활용 사례
SHA-2 계열 변형 비교
SHA-384는 여러 다른 변형과 함께 SHA-2 계열에 속합니다. 아래 표는 다이제스트 크기, 출력 길이, 일반적인 용도에서 어떻게 다른지 보여줍니다.
| 변형 | 다이제스트 | 16진수 길이 | 바이트 | 적합한 용도 |
|---|---|---|---|---|
| SHA-384 | 384 bits | 96 hex chars | 48 bytes | TLS 1.2/1.3, government/CNSA, certificate signatures |
| SHA-256 | 256 bits | 64 hex chars | 32 bytes | TLS, blockchain, code signing, JWTs, SRI |
| SHA-512 | 512 bits | 128 hex chars | 64 bytes | Digital signatures, HMAC with large keys |
| SHA-224 | 224 bits | 56 hex chars | 28 bytes | Truncated SHA-256 — rare, specific compliance |
| SHA-512/256 | 256 bits | 64 hex chars | 32 bytes | SHA-512 speed on 64-bit CPUs, 256-bit output |
SHA-384 대 SHA-256 대 SHA-512 대 SHA-3-384
SHA-384와 다른 해시 알고리즘 중 선택은 보안 요구사항, 플랫폼 제약, 성능 요구에 달려 있습니다. 이 비교는 가장 관련성 높은 속성들을 다룹니다.
| 속성 | SHA-384 | SHA-256 | SHA-512 | SHA-3-384 |
|---|---|---|---|---|
| Digest size | 384 bits (96 hex) | 256 bits (64 hex) | 512 bits (128 hex) | 384 bits (96 hex) |
| Internal state | 512 bits (8x64-bit) | 256 bits (8x32-bit) | 512 bits (8x64-bit) | 1600 bits (sponge) |
| Block size | 1024 bits | 512 bits | 1024 bits | 832 bits |
| Rounds | 80 | 64 | 80 | 24 |
| Word size | 64 bits | 32 bits | 64 bits | N/A (sponge) |
| Length extension | Resistant | Vulnerable | Vulnerable | Resistant |
| 64-bit performance | Fast (native ops) | Slower (32-bit ops) | Fast (native ops) | Moderate |
| Standard | FIPS 180-4 | FIPS 180-4 | FIPS 180-4 | FIPS 202 |
| Web Crypto API | Yes | Yes | Yes | No |
SHA-384 내부 동작 원리
SHA-384는 SHA-512와 동일한 Merkle–Damgård 구조를 통해 입력을 처리합니다. 입력은 1024비트의 배수로 패딩되고 블록으로 분할되며, 각 블록은 64비트 워드 연산으로 Ch, Maj, 두 개의 Sigma 함수를 사용하는 80라운드의 혼합 과정을 거칩니다. SHA-512와의 핵심 차이는 초기 해시값입니다. SHA-384는 9번째부터 16번째 소수의 제곱근 소수 부분에서 파생된 값을 사용하는 반면, SHA-512는 처음 8개 소수를 사용합니다. 모든 블록이 처리된 후, SHA-384는 512비트 내부 상태를 처음 384비트로 잘라냅니다.
SHA-384: fdbd8e75a67f29f701a4e040385e2e23986303ea10239211af907fcbb83578b3e417cb71ce646efd0819dd8c088de1bd
(384 bits = 48 bytes = 96 hex characters)
잘림(truncation)과 다른 초기화 방식으로 인해 SHA-384와 SHA-512는 동일한 입력에 대해 항상 다른 다이제스트를 생성합니다. 또한 이로 인해 SHA-384는 길이 확장 공격에 본질적으로 저항성을 가집니다. 반면 SHA-256과 SHA-512에서는 공격자가 원래 메시지를 알지 못해도 데이터를 추가하고 유효한 해시를 계산할 수 있습니다.
SHA-384 코드 예제
SHA-384는 모든 주요 언어와 런타임에서 네이티브로 지원됩니다. 아래는 프로젝트에 바로 복사하여 사용할 수 있는 예제입니다.
// Works in all modern browsers and Node.js 18+
async function sha384(text) {
const data = new TextEncoder().encode(text)
const hashBuffer = await crypto.subtle.digest('SHA-384', data)
const hashArray = Array.from(new Uint8Array(hashBuffer))
return hashArray.map(b => b.toString(16).padStart(2, '0')).join('')
}
await sha384('hello world')
// → "fdbd8e75a67f29f701a4e040385e2e23986303ea10239211af907fcbb83578b3e417cb71ce646efd0819dd8c088de1bd"
// Node.js (built-in crypto module)
const crypto = require('crypto')
crypto.createHash('sha384').update('hello world').digest('hex')
// → "fdbd8e75a67f29f701a4e040385e2e23986303ea10239211af907fcbb83578b3e417cb71ce646efd0819dd8c088de1bd"import hashlib
# Basic SHA-384 hash
result = hashlib.sha384(b'hello world').hexdigest()
print(result)
# → "fdbd8e75a67f29f701a4e040385e2e23986303ea10239211af907fcbb83578b3e417cb71ce646efd0819dd8c088de1bd"
# Hash a string with Unicode characters
text = 'café ☕'
hashlib.sha384(text.encode('utf-8')).hexdigest()
# → 96-character hex string
# Hash a file in chunks (memory-efficient)
with open('release.tar.gz', 'rb') as f:
sha = hashlib.sha384()
for chunk in iter(lambda: f.read(8192), b''):
sha.update(chunk)
print(sha.hexdigest())package main
import (
"crypto/sha512"
"fmt"
)
func main() {
data := []byte("hello world")
// SHA-384 lives in the crypto/sha512 package
hash := sha512.Sum384(data)
fmt.Printf("%x\n", hash)
// → fdbd8e75a67f29f701a4e040385e2e23986303ea10239211af907fcbb83578b3e417cb71ce646efd0819dd8c088de1bd
}# Using sha384sum (Linux) echo -n "hello world" | sha384sum # → fdbd8e75a67f29f701a4e040385e2e23... - # macOS echo -n "hello world" | shasum -a 384 # → fdbd8e75a67f29f701a4e040385e2e23... - # Using openssl (cross-platform) echo -n "hello world" | openssl dgst -sha384 # → SHA2-384(stdin)= fdbd8e75a67f29f701a4e040385e2e23986303ea... # Verify a file checksum sha384sum myfile.bin > checksum.txt sha384sum -c checksum.txt # → myfile.bin: OK