티스토리 뷰

반응형

안녕하십니까 이번에 작성할 글은 비밀키 암호화에 대해 공부를 하다가 Node.js에서 구현을 해봤습니다.

 

비록 암호학에 대해서는 완벽히 이해하진 못했지만, 조금이라도 안전하게 Server와 Client가 data를 주고받기 위해 어떻게 할 수 있을지에 대해 고민을 하다가 방법을 찾고 실습을 해봤습니다.

 

암호화를 한다면 Token뿐 아니라 중요 Data를 보내거나 받을 때 암호화를 한다면 안전하지 않을까 해서요.

 

 

 

우선 암호학에 대해서 자료를 얻고 싶으시면 여기를 클릭해주세요.

 

암호화 기능은 대부분 언어에서 제공이 되며, Node.js에서도 암호화 함수를 제공합니다.

다만 Node 버전에 따라 사용법이 다르니 Node.js 홈페이지 Doc을 참고해주세요!

 

제가 알아본 Node.js에서 암호화하는 방법으로 2가지를 찾아봤습니다.

1. Crypto이용 (Node.js 내장 모듈)

2. NPM-RSA 모듈 이용

 

이 두가지를 찾아봤는데 Crypto에서 키를 만들기 위해선 Node 버전이 10.12 이상이 돼야 합니다.

NPM-RSA 같은 경우는 8 버전 대에서도 제공이 되고요.

 

우선 Crypto를 이용해보겠습니다. 간단한 설명은 주석으로 올립니다!

    
    // Key 생성 Node 10.12 이상에서 제공
    
    
    /**
    format 에서 pem이나 der 선택을 해야하는데
    pem은 Base64로 인코딩 
    der은 바이너리 형식으로 인코딩
	방식을 말합니다. pem 같은 경우는 aws를 이용해보신 분이라면 pem key 많이 보셨죠??? 바로 그거 입니다.
    */
    generateKeyPair("rsa", {
            modulusLength: 4096,
            publicKeyEncoding: {
              type: "spki", // Key Encoding 방식 선택 type: 'pkcs1' | 'spki';
              format: "pem" // Key Format            type KeyFormat = 'pem' | 'der';
            },
            privateKeyEncoding: {
              type: "pkcs8", // Key Encoding 방식 type: 'sec1' | 'pkcs8';
              format: "pem",
              cipher: "aes-256-cbc", // 알고리즘
              passphrase: "절대로알면 안되는 키"
            }
          },(err, publicKey, privateKey) => {
            // Handle errors and use the generated key pair.
            resolve({
                publicK: publicKey,
                privateK: privateKey
            });    
          });
          

// Public key로 암호화

    const str: string = "public key로 암호화 해보기";
    console.log(`${str} \r\n`);
    
    console.log("public Key로 암호화");
    const enc = crypto.publicEncrypt(r.publicK, Buffer.from(str));
    const encstr = enc.toString("base64");
    console.log(encstr);

    console.log("\r\n");
    console.log("private Key로 복호화");
    // node 11버전부터 이용 가능
    const key = crypto.createPrivateKey({
        key: r.privateK,
        format: "pem",
        passphrase: "절대로알면 안되는 키"      
    });
    // node 10 버전 대에서는 다음과 같이 직접 Object 형태로 만들어야한다.
    // const key = {
    //     key: r.privateK,
    //     format: "pem",
    //     passphrase: "절대로알면 안되는 키"      
    // };
    const dec = crypto.privateDecrypt(key, Buffer.from(encstr, "base64"));
    const decstr = dec.toString("utf8");
    console.log(decstr);
    
 
 
 // Private key로 암호화
    const strp: string = "private key로 암호화 해보기";
    console.log(`${strp} \r\n`);

    console.log("private Key로 암호화");

    const keyp = crypto.createPrivateKey({
        key: r.privateK,
        format: "pem",
        passphrase: "절대로알면 안되는 키"      
    });    

    const dec2 = crypto.privateEncrypt(keyp, Buffer.from(strp));
    const decstr2 = dec2.toString("base64");
    console.log(decstr2);

    console.log("\r\n");

    console.log("public Key로 복호화");
    const enc2 = crypto.publicDecrypt(r.publicK, Buffer.from(decstr2, "base64"));
    const encstr2 = enc2.toString("utf8");
    console.log(encstr2);

 

두 번째로 NPM-RSA 모듈을 이용한 방법입니다. (10 미만 Node.js 추천)

        /**
         * 10 미만은 crypto에 generateKeyPair 기능이 없어 npm-rsa 모듈을 이용하면 쉽다.
         */
        const key = new nodeRSA({b: 512}).generateKeyPair();    
        const publicKey = key.exportKey("pkcs1-public-pem");
        const privateKey = key.exportKey("pkcs8-private-pem");
        
        const text = "Node-Rsa 모듈을 이용한 테스트";

        console.log(text);
        console.log("\r\n");
        console.log("암호화");
        const enc = crypto.publicEncrypt({
            key:publicKey,
            passphrase: "절대로 알면 안되는 키"
        }, Buffer.from(text)).toString("base64");
        console.log(enc);

        console.log("\r\n");
        console.log("복호화");
        const dnc = crypto.privateDecrypt({
            key: privateKey
        }, Buffer.from(enc, "base64")).toString("utf8");
        console.log(dnc);

 

사실 사용법은 NPM-RSA 모듈을 이용하면 간편하나, 개인 Custom을 해야 하는 상황이면 Crypto 모듈을 이용하는 것도 방법이라 생각합니다.

 

 

코드는 여기에서 확인하실 수 있습니다.

 

https://github.com/zlcjfalsvk/a_key_Pair

 

zlcjfalsvk/a_key_Pair

public key 및 private를 이용한 암호화 및 복호화. Contribute to zlcjfalsvk/a_key_Pair development by creating an account on GitHub.

github.com

 

참고 및 출처

 

암호학

https://ko.wikipedia.org/wiki/%EC%95%94%ED%98%B8%ED%95%99#%EB%8C%80%EC%B9%AD%ED%82%A4_%EC%95%94%ED%98%B8_%EC%8B%9C%EC%8A%A4%ED%85%9C

 

NPM-RSA

https://www.npmjs.com/package/node-rsa

https://nodejs.org/docs/latest-v8.x/api/crypto.html#crypto_crypto_privatedecrypt_privatekey_buffer

 

node js crypto a pair key
https://stackoverflow.com/questions/8520973/how-to-create-a-pair-private-public-keys-using-node-js-crypto

https://m.blog.naver.com/PostView.nhn?blogId=cult77&logNo=221463156793&proxyReferer=https%3A%2F%2Fwww.google.com%2F

https://stackoverflow.com/questions/23612355/node-js-how-to-encrypt-and-decrypt-using-public-private-key-pair-using-crypto-m

 

Node.js Buffer

https://nodejs.org/fr/docs/guides/buffer-constructor-deprecation/ 

https://stackoverflow.com/questions/37198831/how-to-load-encrypted-private-key-in-node-js

https://stackoverflow.com/questions/54087514/asymmetric-encryption-using-nodejs-crypto-module

 

DER, PEM

https://www.letmecompile.com/certificate-file-format-extensions-comparison/

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함