320x100
320x100
import { publicEncrypt, publicDecrypt } from "crypto";
function encryptData(data) {
const publicKey = fs.readFileSync(path.join(__dirname, `../rsa/id_rsa.pub`));
const buffer = Buffer.from(JSON.stringify(data));
return publicEncrypt({ key: publicKey }, buffer);
}
function decryptData(encryptData) {
const privateKey = fs.readFileSync(path.join(__dirname, `../rsa/id_rsa`));
return publicEncrypt({ key: privateKey }, encryptData);
}
nodeJS에서 기본으로 제공하는 'crypto' 라이브러리를 사용하면 된다.
이때 중요한 것은 publicKey와 privateKey 모두 pem 형식의 RSA 키여야 한다
pem 형식이란?
-----BEGIN RSA PUBLIC KEY-----
~~~~
-----END RSA PUBLIC KEY-----
위와 키의 시작과 끝이 구분된 형식의 키
pem 데이터 생성 방법
ssh-keygen -f id_rsa.pub -e -m pem
실행하면 ssh-keygen으로 만들었던 기존의 rd_rsa.pub 파일로 부터 pem 데이터를 출력한다
출력된 데이터를 복사하여 id_rsa.pub 파일을 덮어쓰기하고 위 코드를 실행하면 암호화가 정상적으로 된다
error:0409A06E:rsa routines data too large for key size
RSA 암호화 방식은 대칭키 방식 (AES)와 같이 대용량 데이터를 암호화하기에 적합하지 않다
RSA 암호화는 고정된 크기의 블록을 처리하므로, 암호화할 데이터의 크기가 키의 길이를 초과할 수 없다
즉, 암호화 키의 크기보다 큰 데이터는 암호화 할 수 없다는 얘기이다
예를 들어, 2048비트 RSA 키는 약 256바이트 정도의 데이터를 암호화할 수 있는데,
여기에는 패딩과 같은 추가 데이터도 포함된다
때문에 위 오류가 발생했다면 AES 암호화를 해야한다
300x250
728x90
'Programming > NodeJS' 카테고리의 다른 글
NodeJS 대용량 JSON 파일 암호화 및 복호화하기 (0) | 2024.08.24 |
---|---|
NestJS VS ExpressJS (0) | 2024.04.27 |
Express의 단점과 해결방법 (0) | 2024.04.27 |
NodeJS가 싱글 스레드임에도 동시성을 가진 이유 (1) | 2024.03.16 |
JavaScript Winston format 사용 시 객체 출력 방법 (0) | 2024.01.20 |