Node Express - Crypto에 관하여..

Corner·2022년 5월 28일
0

node

목록 보기
4/5
post-thumbnail

[Node.js] Crypto에 관하여..

Crypto ?

💡 Javascript에서 해시 함수를 통해 암호화를 할 수 있도록 도와주는 Node.js 패키지입니다.

먼저, Crypto를 알고 사용하기 전에 해시함수에 관하여 잘 모르겠다면 아래 내용을 참조하시길 바랍니다.

해시함수란 글자를 입력받아, 고정된 길이의 해시값을 출력하는 함수입니다.

같은 글자를 입력하게 되면 똑같은 해시 값을 받게됩니다.

해시 함수의 특징

  • 모든 입력에 고정된 길이의 해시값을 출력합니다.
  • 입력값을 아주 조금이라도 바꾸면 전혀 다른 결과를 출력합니다. (무결성)
  • 결과 값을 가지고 입력값을 유추하는 것은 불가능에 가깝습니다.

해시 함수의 종류

SHA 알고리즘 중에 SHA-1 SHA-256 SHA-384 SHA-512가 있습니다.

해시함수는 해커가 입력할 수 있는 모든 데이터를 입력하고, 그에 따른 결과값을 구한 표(레인보우 테이블)를 가지고 있으면 해시 값을 보고 입력값을 유추할 수 있습니다. 이를 방지하기 위해, 입력 값에 랜덤값(salt)을 추가하는 방법을 사용합니다.


Crypto

Crypto의 필요성

Node.js 앱에서 중요한 정보를 암호화하여 안전하게 보호할 수 있습니다.

Crypto 설치

검색을 하면 Crpyto 패키지를 설치해야할 것처럼 된 글이 많지만

Node.js의 기본 패키지이며, 따로 설치할 필요가 없습니다.

암호화 방법

방법의 특징은 크게 단방향 암호화, 양방향 암호화가 있습니다.

단방향 암호화 : 복호화 할 수 없는 암호화(복호화 = 암호화 되기 이전의 내용으로 되돌리는 것), 해시 함수

양방향 암호화: 대칭형 암호화, 비대칭형 암호화

암호화 사용 절차

요청 값으로 받은 비밀번호를 암호화 --> 암호화된 문자열을 DB에 INSERT(저장)합니다.

--> 사용자가 또 다시 같은 비밀번호를 입력하면 암호화해서 DB에 저장된 암호화 값과 비교하여 === 면 true !==면 false 입니다.

Crypto 사용하기

컨트롤러에서 crypto 모듈을 불러오고 해당 모듈을 사용하는 코드를 작성하면 됩니다.

controller.js

const crypto = require('crypto');

// INSERT 시키는 함수 전에 함수 내부에 요청받은 패스워드 값을 변환하도록 하는 코드
crypto.createHash('sha512').update('password').digest('base64');
crypto.createHash('sha512').update('password').digest('hex');
 

controller.js에서 함수로 해커의 레인보우 테이블 방지하기 위한 salt 생성 코드를 작성합니다.

// salt 값을 구할 때와 해시 값을 구할 때, 작업이 끝날때까지 기다려 주어야 하므로 [동기 방식]으로 사용합니다.
crypto.randomBytes(64, (err, salt) => {
    crypto.pbkdf2('password', salt.toString('base64'), 100000, 64, 'sha512', (err, key) => {
        console.log(key.toString('base64'));
    });
});

randomBytes(64): 64비트 길이의 salt를 반환합니다.

salt는 버퍼 형식이기 때문에 salt.toString('base64')로 base64 문자열로 변환합니다.

pbkdf2(비밀번호, salt, 반복횟수, 비밀번호 길이, 해시 알고리즘) : 설정 값에 따른 최종 해시값을 돌려줍니다.

반복회수 = 해시함수를 몇 번 반복하는지.

비밀번호 길이 = 정책에 맞게 적절한 길이로 설정합니다. (해킹이 어렵게)

해시 알고리즘 = 사용하고 싶은 해시 함수 ( sah512 )

salt를 key와 저장해야만 정확한 비밀번호 비교가 가능합니다.

randomBtytes메소드는 매번 다른 salt값을 돌려주므로, 암호화 결과가 매번 달라집니다.

profile
Full-stack Engineer. email - corner3499@kakao.com,

0개의 댓글