상세 컨텐츠

본문 제목

[NODE] RSA 키 발급

암호화

by 성찬우 2023. 4. 18. 01:19

본문

java와는 약간 다르다... 

키의 형태같은 것들이 다르기 때문에 애먹었던 적이 있다. 

 

필요한 lib 

-  npm i crypto

-  npm i express 

const crypto = require('crypto');
const express = require('express');
const app = express();

키 발급 

const { privateKey, publicKey } = crypto.generateKeyPairSync('rsa', {
    modulusLength: 2048,
    privateKeyEncoding: {
        type: 'pkcs8',
        format: 'pem',
    },
    publicKeyEncoding: {
        type: 'spki',
        format: 'pem',
    },
});

publicKey와 privateKey의 type이 다름을 꼭 알고 넘어가야한다. 내가 알기로는 publicKey는 pkcs8로 생성하지 못한다...

 

const privateKeyObj = crypto.createPrivateKey(privateKey);
const publicKeyObj = crypto.createPublicKey(publicKey);
const privateKeyString = privateKeyObj.export({ type: 'pkcs8', format: 'pem' });
const publicKeyString = publicKeyObj.export({ type: 'spki', format: 'pem' });

이후 이렇게 생성된 키들을 위의 코드로 발급 가능하다. 

콘솔을 찍어보면 키값을 확인하기 위해 export를 해줘야하는 것을 확인할 수 있다. 

근데 굳이 저렇게 할 필요는 없다. 

const message = 'this is plain Text';
const encrypted = crypto.publicEncrypt(
    {
        key: publicKey,
        padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
        oaepHash: 'sha256',
    },
    Buffer.from(message, 'utf8')
);

이렇게 바로 암호화가 가능하기 때문이다. 

하지만 문제는 해당 키값을 클라이언트로 전달해줘야하는데 그냥은 전달해주지 못하기 때문에 반드시 키값을 얻는 방법을 알고 있어야한다. 

 

API를 하나 만들어서 확인해보면

app.post('/save/key', async (req, res) => {
    const jsonResult = {
        publicKey : publicKeyString,
        privateKey : privateKeyString
    }
    res.send(jsonResult).status(200);
});

이렇게 암호화 값들이 들어오는 것을 확인할 수 있다. 

여기서 특이한점은 ------BEGIN PUBLIC KEY --------  와 같은 것들이다. 

JAVA에서 생성할 때는 이런것들이 존재 하지 않았는데 참 어지럽다. 

 

그래서 NODE에서 키발급을 하고 JAVA에서 암복호화할 경우 저 주석같은 것들을 반드시 삭제해주어야한다. (replaceAll)

NODE에서 암복호화 할경우에는 그냥 사용이 가능하다.. 

 

다음 포스팅에서는 저 값들을 JAVA에서 사용하게 되었을 때 어떻게 처리 해야하는지 확인해보고자 한다. 

STRING값으로 전달해줄 예정인데 PRIVATEKEY 오브젝트 및 PUBLICKEY 오브젝트로 변환해주어야 하기 때문에 조금 코드가 길어지고 어지럽다... 

 

관련글 더보기

댓글 영역