암호화
async encryption(data) {
const iv = randomBytes(16);
const cryptoPassword = this.configService.get('CRYPTO_PASSWORD');
const key = (await promisify(scrypt)(cryptoPassword, 'salt', 32)) as Buffer;
const cipher = createCipheriv('aes-256-ctr', key, iv);
const encryptedata = Buffer.concat([cipher.update(data), cipher.final()]);
const encryptedByConcatIvData = Buffer.concat([iv, encryptedata]).toString(
'hex',
);
//cipher.update(data)는 주어진 데이터를 암호화합니다.
// cipher.final()은 암호화 프로세스를 완료하고 남은 데이터를 처리합니다.
// Buffer.concat([...])는 두 개의 버퍼를 결합하여 최종 암호화된 데이터를 생성합니다.
// iv(초기화 벡터)를 암호화된 데이터 앞에 붙여서, 복호화 시 필요한 정보를 포함합니다.
// 마지막으로, .toString('hex')를 사용하여 결합된 데이터를 16진수 문자열로 변환합니다.
return encryptedByConcatIvData;
복호화
private async decryption(data) {
const encryptedDataBufferFromHex = Buffer.from(data, 'hex');
const DataIv = encryptedDataBufferFromHex.slice(0, 16);
const encryptedData = encryptedDataBufferFromHex.slice(16);
const password = this.configService.get('CRYPTO_PASSWORD');
const key = (await promisify(scrypt)(password, 'salt', 32)) as Buffer;
const DataDecipher = createDecipheriv('aes-256-ctr', key, DataIv);
const decryptedBufferData = Buffer.concat([
DataDecipher.update(encryptedData),
DataDecipher.final(),
]);
const decryptedData = decryptedBufferData.toString();
return decryptedData;
}
왜 이걸 썻는지?
보안성: AES는 강력한 보안성을 제공하며, 현재까지 알려진 공격에 대해 안전하다고 평가받고 있습니다.
속도: AES는 하드웨어와 소프트웨어에서 모두 빠르게 실행될 수 있어 성능이 우수합니다
표준화: AES는 미국 정부에 의해 표준으로 채택되었으며, 국제적으로 널리 사용되고 있습니다.
키 길이: AES는 128, 192, 256 비트의 다양한 키 길이를 지원하여 보안 수준을 조정할 수 있습니다.
5. 대칭키 암호화: AES는 대칭키 암호화 방식으로, 동일한 키로 암호화와 복호화를 수행하므로 구현이 간단합니다.
이러한 이유로 AES는 데이터 보호 및 보안 통신에 널리 사용됩니다.