종류 | 암호화 | 복호화 | 암호화 방식 | 알고리즘 |
---|---|---|---|---|
단방향 | 가능 | 불가능 | Hash | MD5, SHA-1, SHA-256 |
양방향 | 가능 | 가능 | 대칭키 | AES, DES |
공개키 | RSA, ECC |
Hash
- 해시 함수에 의해 얻어지는 값
- 해시 함수 = 해시 알고리즘
- 임의의 크기의 데이터를 고정된 크기의 데이터로 변환하는 함수
- key : 매핑 전 원래의 데이터 값
- 해시 값 : 매핑 후 데이터 값
- 해싱 : 매핑하는 과정
💥 DES (Data Encryption Standard)
const cyrpto = require("crypto");
// createHash("sha512") : 해시를 만들기 위해 사용하는 함수로, 매개변수로는 사용할 알고리즘 이름을 받음
// update(password) : password 문자열을 전달함, 이 데이터를 해시 함수 입력값으로 사용
// digest("base64") : 해시를 만들 때 사용할 인코딩 방식을 설정
// base64 : 64개의 가능한 문자로 데이터를 인코딩하는 방식
const createHashedPassword = (password) => {
return crypto.createHash("sha512").update(password).digest("base64");
};
해시 함수의 한계 - 레인보우 테이블
- 레인보우 테이블 : 해시 함수를 사용해 만들어낼 수 있는 값들을 대량으로 저장해놓은 표
- 해시 함수를 사용하여 암호화된 비밀번호를 빠르게 역추적하여 원본 비밀번호를 찾는 공격 기법
- 암호화 보안법
- salt : 입력한 값에 salt라는 특정 값을 붙여 변형시키는 것
- 해시 함수 반복 : 해시 함수를 여러 번 돌려 본래의 값을 예측하기 어렵게 만드는 것
const cyrpto = require("crypto");
const salt = crypto.randomBytes(16).toString("base64"); // 솔트 생성
const iterations = 100000; // 반복 횟수
const keylen = 64; // 생성할 키의 길이
const digest = "sha512"; // 해시 알고리즘
const createPbkdf = (password) => {
return crypto.pbkdf2Sync(password, salt, iterations, keylen, digest).toString("base64");
};
const cyrpto = require("crypto");
const algorithm = "aes-256-cbc"; // 알고리즘
const key = crypto.randomBytes(32); // 256비트 키
const iv = crypto.randomBytes(16); // 초기화 벡터
// 암호화
const cipherEncrypt = (word) => {
const cipher = crpto.createCipheriv(algorithm, key, iv); // 암호화 객체 생성
let encryptedData = cipher.update(word, "utf-8", "base64"); // 암호화할 데이터 처리
encryptedData += cipher.final("base64");
return encryptedData;
};
// 복호화
const decipher = (encryptedData) => {
const decipher = crypto.createDecipheriv(algorithm, key, iv); // 복호화 객체 생성
let decryptedData = decipher.update(encryptedData, "base64", "utf-8");
decryptedData += decipher.final("utf-8");
return decryptedData;
npm i bcrypt
const bcrypt = require ("bcrypt");
const salt = 10;
const bcryptPassword = (password) => {
return bcrypt.hashSync(password, salt);
};
const comparePassword = (password, dbPassword) => {
return bcrypt.compareSync(password, dbPassword);
};