Node.js비동기와 런타임

crypto 해시와 random

Node.js `crypto` 모듈에서 해시와 난수 생성이 각각 어떤 용도에 맞는지 정리합니다.

마지막 수정 2026년 3월 21일

기본 패턴

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