개요
Node.js의 crypto.createHash() 메서드는 지정된 알고리즘을 기반으로 해시(Hash) 객체를 생성한 후 이를 반환합니다. 반환된 해시 객체는 update()와 digest() 메서드를 체이닝하여 데이터의 해시 다이제스트를 손쉽게 생성할 수 있습니다. 선택 사항인 options 매개변수는 스트림 동작을 제어하는 용도로 사용되며, XOF 또는 shake256처럼 가변 길이 출력을 지원하는 해시 함수의 경우 outputLength 옵션으로 원하는 출력 길이를 바이트 단위로 지정할 수 있습니다.
문법(Syntax)
crypto.createHash(algorithm, [options])
매개변수
algorithm – 해시 다이제스트를 생성하는 데 사용할 알고리즘입니다. 문자열(string) 타입이며,
sha256,sha512,md5등 OpenSSL에서 지원하는 알고리즘 이름을 지정할 수 있습니다.options – 스트림 동작을 제어하기 위한 선택적(optional) 매개변수입니다.
예제 1: 문자열 해시 생성하기
먼저 createHash.js라는 이름의 파일을 생성하고 아래 코드를 복사한 뒤, 다음 명령어로 실행합니다.
node createHash.js
createHash.js
// crypto.createHash() 데모 예제
// crypto 모듈 불러오기
const crypto = require('crypto');
// 시크릿 키 정의
const secret = 'TutorialsPoint';
// createHash 메서드 초기화
const hashValue = crypto.createHash('sha256', secret)
// 인코딩할 데이터 입력
.update('Welcome to TutorialsPoint !')
// 인코딩 방식 지정
.digest('hex');
// 결과 출력
console.log("생성된 해시 값: ", hashValue);
실행 결과
C:\home\node>> node createHash.js
생성된 해시 값:
5f55ecb1ca233d41dffb6fd9e307d37b9eb4dad472a9e7767e8727132b784461
위 예제에서는 sha256 알고리즘으로 해시 객체를 만든 뒤, update()로 문자열 데이터를 전달하고 digest('hex')를 호출해 16진수(hex) 형태의 최종 해시 값을 얻었습니다.
예제 2: 파일 스트림 해시 생성하기
두 번째 예제는 대용량 파일을 한 번에 메모리에 올리지 않고, 스트림(stream)으로 조금씩 읽으면서 해시 값을 계산하는 방법을 보여줍니다. 이 방식은 파일 무결성 검증 등에 유용하게 활용됩니다.
// crypto.createHash() 데모 예제
// 모듈 불러오기
const crypto = require('crypto');
const fs = require('fs');
// 현재 파일 경로 가져오기
const filename = process.argv[1];
// 현재 경로에 대한 해시 객체 생성
const hash = crypto.createHash('sha256', "TutorialsPoint");
const input = fs.createReadStream(filename);
input.on('readable', () => {
// 해시 스트림에서 생성된 데이터를 하나씩 읽기
const val = input.read();
if (val)
hash.update(val);
else {
console.log(`${hash.digest('hex')} ${filename}`);
&;}
});
실행 결과
C:\home\node>> node createHash.js
d1bd739234aa1ede5acfaccee657296ead1879644764f45be17466a9192c3967
/home/node/test/createHash.js
파일을 모두 읽고 더 이상 읽을 데이터가 없으면 readable 이벤트 핸들러에서 val이 null이 되며, 이때 digest('hex')를 호출해 최종 해시 값과 파일 경로를 함께 출력합니다.
핵심 정리
crypto.createHash(algorithm)은 지정한 알고리즘의 해시 객체를 생성하고 반환합니다.update(data)로 해싱할 데이터를 입력하며, 여러 번 호출해 데이터를 누적할 수 있습니다.digest(encoding)로 최종 해시 다이제스트를 생성하며,'hex','base64'등의 인코딩 방식을 지정할 수 있습니다.대용량 파일은 스트림으로 읽으며 순차적으로
update()>를 호출하는 방식이 효율적입니다.