본문 바로가기

JAVASCRIPT

Bcrypt - 단방향 암호화

단방향 암호화는 암호화만 되는 것을 말하며 암호를 푸는 복호화는 할 수 없음을 말한다.

단방향 암호화에 사용되는 해시 알고리즘은 동일한 평문에 대해서 항상 동일한 해시 값을 갖습니다.

따라서 특정 해시 알고리즘에 대해서 어떠한 평문이 어떠한 해시값을 갖는지 알 수 있습니다.

 

해시 함수는 빠르게 데이터를 검색하기 위해 생겼습니다. 따라서 공격자가 공격타겟을 빠른 속도로 임의의 문자열의 해시값과 해킹할 대상의 해시값을 비교하여 찾을 수 있습니다.

===========================

 

이러한 문제를 보안하기위해 Salting 과 Key stretching을 적용 시킵니다. 

 

1. Salting(솔팅)

단반향 해시 함수를 통해 암호화를 진행할 때 암호화하려는 데이터에 랜덤으로 데이터를 더하여 암호화를 진행하는 방식 입니다.

원래의 데이터에 추가 데이터를 넣었기 때문에 원래의 해시값과 다름니다.

 

2. Key Stretching(키 스트레칭)

단방향 해시값을 계산한후, 그 해시 값을 또 해시하고 이를 반복해주는 방식

최근 일반적 장비를 1초에 50억개 해시값을 비교할 수 있었지만, 키 스트레칭을 적용하여 동일한 장비에서 1초에 5개 정도로만 비교 할수 있습니다. GPU를 사용하더라도 수백에서 수천정도로만 비교 할 수 있음

 

 

 

 


Bcrypt 

솔팅과 키 스트레칭을 적용한 대칭형 블록 암호에 기반을 둔 해시함수

 

 

bcrypt 구조

 

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