단방향 암호화는 암호화만 되는 것을 말하며 암호를 푸는 복호화는 할 수 없음을 말한다.
단방향 암호화에 사용되는 해시 알고리즘은 동일한 평문에 대해서 항상 동일한 해시 값을 갖습니다.
따라서 특정 해시 알고리즘에 대해서 어떠한 평문이 어떠한 해시값을 갖는지 알 수 있습니다.
해시 함수는 빠르게 데이터를 검색하기 위해 생겼습니다. 따라서 공격자가 공격타겟을 빠른 속도로 임의의 문자열의 해시값과 해킹할 대상의 해시값을 비교하여 찾을 수 있습니다.
===========================
이러한 문제를 보안하기위해 Salting 과 Key stretching을 적용 시킵니다.
1. Salting(솔팅)
단반향 해시 함수를 통해 암호화를 진행할 때 암호화하려는 데이터에 랜덤으로 데이터를 더하여 암호화를 진행하는 방식 입니다.
원래의 데이터에 추가 데이터를 넣었기 때문에 원래의 해시값과 다름니다.
2. Key Stretching(키 스트레칭)
단방향 해시값을 계산한후, 그 해시 값을 또 해시하고 이를 반복해주는 방식
최근 일반적 장비를 1초에 50억개 해시값을 비교할 수 있었지만, 키 스트레칭을 적용하여 동일한 장비에서 1초에 5개 정도로만 비교 할수 있습니다. GPU를 사용하더라도 수백에서 수천정도로만 비교 할 수 있음
Bcrypt
솔팅과 키 스트레칭을 적용한 대칭형 블록 암호에 기반을 둔 해시함수
사용예제
//터미널에서
npm install bcrypt --save
const bcrypt = require('bcrypt')
const saltRounds = 10
const password = 'password'
//암호화하는 함수
const makeHash = async(password, saltRounds) =>{
return await bcrypt.hash(password,saltRounds)
}
//검증함수
const checkHash = async(password, hashedPassWord) =>{
return await bcrypt.compare(password, hashedPassword)
}
const main = async() =>{
const hasedPassword = await makeHash(password, saltRounds);
const result = await checkHash("password",hasedPassword);
console.log(hasedPassword):
console.log(result);
}
main()
>> 해시값
>> true
'JAVASCRIPT' 카테고리의 다른 글
(unic5n)프젝 중 잠깐 리팩토링 - 제품나열DAO Ver1 (0) | 2023.04.06 |
---|---|
회원가입 및 포스팅 후기 (0) | 2023.03.30 |
Error : data must be a string or Buffer and hash must be string (0) | 2023.03.28 |
구조분해할당-기초?예시 (0) | 2023.03.27 |
app.get VS router.get (0) | 2023.03.26 |