Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

Node.js crypto.scrypt() 메서드 완벽 정리 – 문법, 매개변수, 예제까지

Node.js의 crypto.scrypt() 메서드는 scrypt 알고리즘의 비동기 구현을 제공합니다. scrypt는 패스워드 기반 키 유도 함수(Password-Based Key Derivation Function)로, 무차별 대입 공격(brute-force attack)으로부터 시스템을 보호하고 공격자가 성공하기 어렵게 만드는 역할을 합니다. 다만 scrypt 함수는 연산 비용과 메모리 사용량 모두 상당히 높은 편이라는 점을 유의해야 합니다.

문법

crypto.scrypt(password, salt, keylen, [options], [callback])

매개변수 설명

  • password – scrypt에서 디코딩 작업에 필요한 패스워드 값입니다. 문자열(string), 객체(object), TypedArray 등 다양한 형태로 전달할 수 있습니다.

  • salt – 가능한 한 고유한(unique) 값이어야 하며, 주로 데이터 암호화에 사용됩니다. 솔트(salt)의 권장 최소 길이는 16바이트입니다.

  • keylen – 생성될 키의 길이를 정의하며, 반드시 숫자(number)여야 합니다.

  • options

    • cost – 메모리당 소요되는 CPU 비용을 의미합니다. 이 값은 1보다 큰 2의 거듭제곱이어야 하며, 기본값은 16384입니다.

    • blockSize – 각 블록의 크기를 정의하는 매개변수입니다. 기본값은 8입니다.

    • parallelization – 병렬화(parallelization) 수준을 정의하는 매개변수입니다. 기본값은 1입니다.

    • N – cost 매개변수의 별칭(alias)으로, 대신 사용할 수 있습니다. 단, 두 값을 동시에 지정할 수는 없습니다.

    • r – blockSize 매개변수의 별칭입니다. 마찬가지로 두 값 중 하나만 지정할 수 있습니다.

    • p – parallelization 매개변수의 별칭입니다. 하나만 정의할 수 있습니다.

    • maxmem – 메모리 사용량의 상한값입니다. 128*N*r > maxmem 조건이 되면 에러가 발생합니다. 기본값은 32*1024*1024입니다.

  • callback – 에러 발생 시 이를 처리하고 싶을 때 호출되는 콜백 함수입니다.

예제 1

먼저 scrypt.js라는 이름의 파일을 생성하고 아래 코드를 복사해 넣습니다. 그다음 다음 명령어로 코드를 실행할 수 있습니다.

node scrypt.js

scrypt.js

// Node.js 프로그램: crypto.scrypt() 메서드 동작 확인

// crypto 모듈 불러오기
var crypto = require('crypto');

// 기본 파라미터로 scrypt() 메서드 호출
crypto.scrypt('tutorialspoint', 'asdfghjkl', 32, (err, derivedKey) => {

if (err) throw err;

// 유도된 키를 버퍼(buffer) 형태로 출력
console.log("The derived key(1) is:", derivedKey);
});

// cost 옵션(N)을 지정하여 scrypt() 메서드 호출
crypto.scrypt('GeeksforGeeks', 'tfytdx', 128,
    { N: 512 }, (err, derivedKey) => {

if (err) throw err;

// 유도된 키를 버퍼(buffer) 형태로 출력
console.log("The derived key(2) is:", derivedKey);
console.log();
});

실행 결과

C:\home\node>> node scrypt.js
The derived key(2) is: <Buffer b3 f8 72 5f 58 df 98 d9 c0 8a ba 0c 2c 50 85 b1
76 de 39 35 40 27 7d 57 f1 6a a1 07 54 dc c9 63 65 32 f2 db 29 95 dc ee 0b 9f
e3 d5 0a 9e 3a d0 f6 b4 ... >

The derived key(1) is: <Buffer ae 50 38 61 17 f7 11 51 e4 50 63 3c 2a 9c ec f0
46 42 a6 ca 04 78 67 05 c8 8c 0c 69 00 c3 03 7f>

예제 2

이번에는 TypedArray와 DataView를 솔트(salt)로 활용하는 또 다른 예제를 살펴보겠습니다.

// Node.js 프로그램: crypto.scrypt() 메서드 동작 확인

// crypto 모듈 불러오기
var crypto = require('crypto');

// 솔트 값을 TypedArray(Uint32Array)로 초기화
const salt = new Uint32Array(7);

// 지정된 파라미터로 scrypt() 메서드 호출
crypto.scrypt('WelcomeTutorialspoint', salt, 16, (err, derivedKey) => {
    if (err) throw err;
    // 유도된 키를 ascii 인코딩 문자열로 출력
    console.log("The derived key(1) is:",
        derivedKey.toString("ascii"));
});

// 솔트 값을 DataView로 초기화
const newSalt = new DataView(new ArrayBuffer(5));

// cost 파라미터(N)를 적용하여 scrypt() 메서드 호출
crypto.scrypt('HelloTutorialspoint', newSalt, 16, { N: 32 }, (err, derivedKey) => {
    if (err) throw err;
    // 유도된 키를 base64 인코딩 문자열로 출력
    console.log("The derived key(2) is:",
        derivedKey.toString("base64"));
});

실행 결과

C:\home\node>> node scrypt.js
The derived key(2) is: PBYDRlgayLVGjC8z3YUcSQ==
The derived key(1) is: <Uu0allCb,d?,Z5_

정리

crypto.scrypt() 메서드는 패스워드로부터 안전한 암호화 키를 유도하는 강력한 도구입니다. cost(N), blockSize(r), parallelization(p), maxmem 같은 옵션을 적절히 조절하면 보안 수준과 성능 사이의 균형을 맞출 수 있습니다. 특히 솔트는 항상 고유한 값을 사용하고 최소 16바이트 이상 확보하는 것이 안전한 키 유도의 핵심입니다.