Node.js Decipher.final() 메서드란?
decipher.final()은 복호화(decipher) 객체의 값을 담은 버퍼(Buffer) 또는 문자열을 반환하는 Node.js 내장 메서드입니다. 이 메서드는 crypto 모듈에서 제공되며, update()로 처리된 나머지 데이터를 마무리하는 역할을 합니다.
주의: final()이 호출된 이후에는 해당 decipher 객체로 더 이상 데이터를 복호화할 수 없으며, 두 번 이상 호출하면 에러가 발생합니다. 따라서 반드시 복호화 작업의 마지막에 한 번만 호출해야 합니다.
반환값
outputEncoding이 지정되면 문자열을 반환하고, 생략하면 Buffer 객체를 반환합니다.
문법
decipher.final([outputEncoding])
매개변수
outputEncoding – 출력 인코딩 방식을 지정하는 선택적 매개변수입니다. 문자열 타입이며
hex,base64,utf8등의 값을 사용할 수 있습니다.
예제 1: 기본적인 복호화
아래 코드를 decipherFinal.js라는 이름의 파일로 저장한 뒤, 다음 명령어로 실행해 보세요.
node decipherFinal.js
decipherFinal.js
// cipher.final() 메서드 사용 예시
// crypto 모듈 가져오기
const crypto = require('crypto');
// AES 알고리즘 초기화
const algorithm = 'aes-192-cbc';
// 키 생성에 사용할 비밀번호 설정
const password = '12345678123456789';
// decipher 객체용 키 생성
const key = crypto.scryptSync(password, 'old data', 24);
// 고정 IV(초기화 벡터) 설정
const iv = Buffer.alloc(16, 0);
const decipher = crypto.createDecipheriv(algorithm, key, iv);
// 복호화할 암호문(hex 인코딩)
const encrypted1 =
'a05e87569f3f04234812ae997da5684944c32b8776fae676b4abe9074b31cd2a';
let decryptedValue1 = decipher.update(encrypted1, 'hex', 'utf8');
decryptedValue1 += decipher.final('utf8');
// 결과 출력
console.log('Decrypted value -- ' + decryptedValue1);
실행 결과
C:\home\node>> node decipherFinal.js Decrypted value -- Welcome to tutorials point
위 예제에서는 update()로 대부분의 데이터를 복호화한 뒤, final('utf8')을 호출해 남은 데이터까지 모두 처리하고 그 결과를 하나의 문자열로 연결했습니다.
예제 2: 버퍼 배열 활용
이번에는 복호화된 데이터를 배열에 담아 처리하는 또 다른 방식의 예제를 살펴보겠습니다.
// cipher.final() 메서드 사용 예시
// crypto 모듈 가져오기
const crypto = require('crypto');
// AES 알고리즘 초기화
const algorithm = 'aes-192-cbc';
// 키 생성에 사용할 비밀번호 설정
const password = '12345678123456789';
// decipher 객체용 키 생성
const key = crypto.scryptSync(password, 'old data', 24);
// 고정 IV(초기화 벡터) 설정
const iv = Buffer.alloc(16, 0);
const decipher = crypto.createDecipheriv(algorithm, key, iv);
// 복호화할 암호문(hex 인코딩)
const encrypted =
'a05e87569f3f04234812ae997da5684944c32b8776fae676b4abe9074b31cd2a';
var buf = [];
// 복호화 진행
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
// 복호화된 데이터를 버퍼 배열에 추가
buf.push(decrypted);
buf.push(decipher.final('utf8'));
// 결과 출력
console.log(buf.join(' '));
실행 결과
C:\home\node>> node decipherFinal.js Welcome to tutor ials point
두 번째 예제에서는 buf.join(' ')이 배열 요소 사이에 공백을 삽입하기 때문에 'tutor'와 'ials' 사이에 공백이 추가되어 출력됩니다. 이는 final()이 update()에서 처리하지 못한 나머지 블록을 반환한다는 사실을 잘 보여줍니다.
정리
decipher.final()은 복호화 과정을 마무리하는 필수 메서드로, 반드시 한 번만 호출해야 하며 호출 이후에는 해당 객체를 재사용할 수 없습니다. createDecipheriv → update → final의 올바른 호출 순서를 지키는 것이 안정적인 복호화의 핵심입니다.