crypto-js란?
javascript에서 해시 함수를 통한 암호화를 할 수 있도록 해주는 Node.js 패키지
해시함수란?
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
});
반응형