
단방향 특징
- 데이터 무결성을 검증하는 데 주로 사용되며, 패스워드 저장 등에서도 활용된다.
- 단방향이므로 원본 데이터를 복원할 수 없다.
- 동일한 데이터에 대해서는 항상 동일한 해시값이 생성되지만, 서로 다른 데이터에 대해서도 같은 해시값이 나올 수 있어 충돌이 발생할 수 있다.
- 미세한 데이터 변화에도 해시값은 완전히 달라진다.
- 주로 해시 함수(MD5, SHA-1, SHA-256 등)를 사용하여 구현된다.
양방향 특징
- 데이터의 기밀성을 유지하거나 안전한 통신을 위해 사용된다.
- 공개키와 대칭키 암호화를 조합하여 데이터 보안을 유지하면서 처리 속도를 향상시킨다.
- HTTPS와 같은 프로토콜로 클라이언트-서버 통신을 보호하여 안전한 웹 통신을 제공한다.
"해시 함수 = 해시 알고리즘"
해시 함수와 해시 알고리즘이 동일한 개념을 나타낸다는 뜻이다.
즉, 해시 함수를 사용하여 데이터를 변환하고 고정된 크기의 해시 값을 생성하는 과정은 해시 알고리즘에 따라 수행된다.
이 두 용어는 일반적으로 서로 바꿔 사용할 수 있으며, 특정 알고리즘(예: MD5, SHA-256 등)을 사용하여 해시 값을 생성하는 방식을 의미한다.
Salt:
해시 함수 반복:
- 정의: 해시 함수를 여러 번 반복하여 원본 데이터를 추적하기 어렵게 만든다.
- 활용 방법: 해싱 과정을 반복해 연산 복잡도를 높여 해킹을 어렵게 만든다.
const crypto = require('crypto');createHash(algorithm): 해시 알고리즘을 통해 해시 값을 생성한다. (데이터의 무결성을 확인하거나 비밀번호 해싱 등에 사용)pbkdf2Sync(password, salt, iterations, keylen, digest): 비밀번호 기반의 키 도출 함수를 사용해 비밀번호를 해싱하고, 보안을 강화한다. (알고리즘을 사용하여 비밀번호를 해싱. 입력값으로 비밀번호, 솔트, 반복 횟수, 원하는 해시 길이 등을 받음. 비밀번호 저장 및 검증 시 보안성을 높이기 위해 사용함.)createCipheriv(algorithm, key, iv) / createDecipheriv(algorithm, key, iv): 대칭키 암호화를 통해 데이터를 암호화하는 메서드이다. (데이터를 암호화 하거나 복호화 하는데 사용)crypto.createCipheriv(algorithm, key, iv);cipher.update(word, "utf-8", "base64");const crypto = require('crypto');
const salt = crypto.randomBytes(16).toString("base64");// 임의의 솔트 생성
const iteration = 1000; // 해시 함수를 반복할 횟수
const keylen = 64; // 생성할 키의 길이
const digest = "sha512"; // 해시 알고리즘
// PBKDF2 함수를 사용한 비밀번호 해싱
const createpbkdf = (password) => {
// createHash(알고리즘).update(암호화할 값).digest(인코딩 방식)
return crypto.pbkdf2Sunc(password, salt, iteration, keylen, digest).toString("base64");
};
// 암호화 및 복호화 예시
const hashedPassword = createPBKDF2("password123");
console.log(`Hashed password: ${hashedPassword}`);
⬇️ 설명 ⬇️

16진수란? 각 숫자는 0-9까지는 숫자로, 10-15까지는 a부터 f까지의 문자로 구성.

복호화는 암호화 과정과 거의 동일하다. 주요 차이점은 다음과 같다 :
비밀키와 초기화벡터는 동일해야 한다: 암호화와 복호화 모두 동일한 비밀키와 초기화 벡터를 사용해야 정확하게 원본 데이터를 복원할 수 있다.
암호문을 입력하고 원본 데이터를 출력: 복호화 시, 암호화된 데이터(암호문)를 입력하여 원본 데이터를 복원한다.
입출력 인코딩 순서가 반대: 암호화 시 입력은 원문, 출력은 암호문이고, 복호화 시 입력은 암호문, 출력은 원문이므로 인코딩 방식이 반대로 처리된다.
Bcypte는 npm install bcypte 명령어를 입력해야 사용할 수 있다.
명령어를 입력하고 const bcrypt = require('bcrypt') 를 명시하여 bcrypt를 가져온다.
bctyptPassword(password): 비밀번호를 입력받아 솔트를 추가해 해싱한다.comparePassword(password, hashedPassword): 입력된 비밀번호와 해시된 비밀번호가 일치하는지 확인한다.// bcrypt
// : 비밀번호 암호화하는 알고리즘 중 하나
// : 주로 강력한 보안 필요할 때 사용
// : blowfish 암호를 기반으로 설계된 단방향 암호화 함수
const bcrypt = require("bcrypt");
const originalPw = "1234";
const saltRounds = 10; // 솔트 라운드 수를 정의
// 1. 비밀번호 해싱 함수
function bctyptPassword(password) {
return bcrypt.hashSync(password, saltRounds); // salt 자동 생성
}
// 2. 원본 비밀번호와 해시된 비밀번호가 일치하는지 확인하는 함수
function comparePassword(password, hashedPw) {
return bcrypt.compareSync(password, hashedPw);
}
// 사용 예제
// 원본 비밀번호를 해싱한 결과
const hashedPw = bctyptPassword(originalPw);
console.log(`Hashed password : ${hashedPw}`);
// 원본 비밀번호와 해시된 비밀번호가 일치하는지 확인
const isMatch = comparePassword(originalPw, hashedPw);
console.log(`비밀번호 일치 : ${isMatch}`);
const isMatch2 = comparePassword("1818", hashedPw);
console.log(`비밀번호 일치 : ${isMatch2}`);
참고해도 좋은 강의