Languages/Javascript

[Node.js] crypto-js란? / 사용법

MOONCO 2021. 3. 7. 22:55

crypto-js란?

javascript에서 해시 함수를 통한 암호화를 할 수 있도록 해주는 Node.js 패키지

 

해시함수란? 

 

[프로그래밍] 블록체인이란?

블록체인이란? 정보가 담긴 블록을 체인형태로 묶은 것으로, 여러명의 사람들이 하나의 데이터를 나눠서 저장하는 기술 블록체인의 필요성 하나의 컴퓨터가 해킹당해 정보가 조작되었더라도,

defineall.tistory.com

 

crypto-js의 필요성

javascript를 이용한 서비스에서, 여러가지 정보(ex:비밀번호)를 안전하게 암호화 할 수 있다.

 

crypto-js 설치

npm i -d crypto-js

// Typescript에서 사용시 추가 설치
npm i --save-dev @types/crypto-js

 

crypto-js 암호화 방식

 

1. 대칭키 (Symmetric Encryption) : 암호화 - 복호화 할 때 같은 키값을 이용

2. 비대칭키 (Asymmetric Encryption) : 암호화 - 복호화 할 때 다른 키값을 이용 

3. 해싱 (hashing) : 단방향으로 암호화만 가능하고 복호화 할 수 없다. 비밀번호 등에 이용. 

알고리즘 종류 비고
대칭키 DES, 3-DES, AES(128bit, 256bit), SEED, ARIA AES가 가장 보편적으로 이용
비대칭키 RSA, ECC, DSS  
해싱 MD5, SHA-0, SHA-1, SHA-2  

* 암호화 방식 자세히 알아보기 / https://defineall.tistory.com/1013


crypto-js 사용 ( AES 암복호화 )

// crypto-js 모듈 불러오기

import crypto-js from 'crypto-js'


// 암호화 할 데이터

const data = {
    username:'Jinho Kim',
    age: 25
};


// 복호화 키 지정

const privateKey =  'secret key';


// AES알고리즘 사용 암호화

const encrypted = CryptoJS.AES.encrypt(JSON.stringify(data), secretKey).toString();


// AES알고리즘 사용 복호화 ( 복구 키 필요 )

const bytes = CryptoJS.AES.decrypt(encrypted, secretKey);


// 인코딩, 문자열로 변환, JSON 변환

const decrypted = JSON.parse(bytes.toString(CryptoJS.enc.Utf8));

 

HMAC

비밀 메시지와 공유 메시지를 합친 후에, 해시 함수에 입력한다.

( 공유 메시지는 송신자와 수신자가 가지고 있다 - 메시지 보안 상승 )
// 1번째 방식 - 하나의 공유 메시지 사용
var hash = CryptoJS.HmacMD5("공유 메시지", "비밀 메시지");
var hash = CryptoJS.HmacSHA1("공유 메시지", "비밀 메시지");
var hash = CryptoJS.HmacSHA256("공유 메시지", "비밀 메시지");
var hash = CryptoJS.HmacSHA512("공유 메시지", "비밀 메시지");


// 2번째 방식 - 여러개의 공유 메시지 사용
var hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, "비밀 메시지");
hmac.update("공유 메시지 1");
hmac.update("공유 메시지 2");
hmac.update("공유 메시지 3");

var hash = hmac.finalize();

 

PBKDF2

해시 함수에 보안 과정 추가하기
// 암호화를 위한 랜덤 키값 생성
var salt = CryptoJS.lib.WordArray.random(128 / 8);

// digest - salt를 통해 암호화 한 최종값
var key128Bits = CryptoJS.PBKDF2("Secret Passphrase", salt, {
  // 128비트 암호화 / 32바이트 결과값 출력
  keySize: 128 / 32
});

var key256Bits = CryptoJS.PBKDF2("Secret Passphrase", salt, {
  keySize: 256 / 32
});

var key512Bits = CryptoJS.PBKDF2("Secret Passphrase", salt, {
  keySize: 512 / 32
});

var key512Bits1000Iterations = CryptoJS.PBKDF2("Secret Passphrase", salt, {
  keySize: 512 / 32,
  // 해시 함수 암호화 과정 1000번 반복
  iterations: 1000
});

 

반응형