기본 패턴
javascript
import { createHash, randomUUID, randomBytes } from "node:crypto";
const digest = createHash("sha256").update("hello").digest("hex");
const requestId = randomUUID();
const token = randomBytes(16).toString("hex");설명
createHash()는 같은 입력에 대해 항상 같은 결과를 만드는 해시를 계산할 때 씁니다. 파일 무결성 확인, 캐시 키 생성, 콘텐츠 fingerprint에 잘 맞습니다.randomUUID()와randomBytes()는 예측하기 어려운 값을 만들 때 씁니다. 세션 토큰, 임시 코드, nonce처럼 "다음 값을 맞히면 안 되는" 상황에 적합합니다.- 해시는 "원문을 숨기는 암호화"가 아닙니다. 단방향 요약에 가깝고, 복호화 개념이 없습니다.
- 비밀번호 저장처럼 공격 모델이 큰 경우에는 단순 SHA-256보다
scrypt,pbkdf2,argon2같은 password hashing 계열을 따로 고려해야 합니다. Math.random()은 일반적인 난수 시뮬레이션에는 쓸 수 있어도, 보안 토큰 생성용으로는 적합하지 않습니다.
짧은 예제
javascript
import { scryptSync, randomBytes } from "node:crypto";
const salt = randomBytes(16);
const passwordHash = scryptSync("secret-password", salt, 64).toString("hex");빠른 정리
| 항목 | 쓰임 |
|---|---|
createHash() | 파일 내용, 문자열, payload 요약 |
randomUUID() | 요청 ID, 리소스 ID |
randomBytes() | 토큰, 키 재료, nonce |
scrypt() | 비밀번호 파생 키 생성 |
주의할 점
해시와 암호화, 난수와 UUID는 서로 대체 개념이 아닙니다.
"같은 입력이면 같은 출력"이 필요하면 해시, "예측 불가능성"이 필요하면 randomBytes()나 randomUUID()를 고르는 식으로 목적을 먼저 분리해서 생각하는 편이 안전합니다.
참고 링크
1 sources