Bcrptjs의 필요성
초기에 원활한 test와 DB에서 손쉽게 비밀번호를 변경하기 위해 암호화를 진행하지 않았다. 하지만 곧 MVP 기간이 다가오자 User의 Password를 암호화 할 필요성이 생겼다. 이전에 Django를 사용할 때는 자동적으로 암호화를 진행해주어 깊게 공부한 적이 없었지만 Bcryptjs를 사용하면서 공부의 필요성을 느꼈다
암호화 함수
export const hashPassword = async (password: string) => {
const salt = await genSalt(12)
const hashedPassword = await hash(password, salt)
return hashedPassword
}
이 함수는 상당히 간단하다. password를 인자로 받고, 암호화를 위해 Salt라는 것을 생성한다. 암호화를 진행한 후 암호화된 Password를 반환한다
genSalt? salt?
salt = 소금, 즉 다된 요리에다가 소금까지 친다는 의미이다. 비밀번호의 암호화와 함께 보안을 무작위성을 더해준다. Salt는 해쉬 함수에서 암호화된 비밀번호를 생성할 때 추가되는 byte 단위의 무작위 문자열이다
$2a$12$ma/AkptpdrueOHy5PSjiMOW/Beg9PLH/kie7GB/KsI17dE5jujbeq
- 식별자 ($2a$):
- $2a$는 bcrypt 알고리즘의 버전을 나타낸다
- 코스트 ($12$):
- $12$는 해시의 Cost Factor를 나타낸다. genSalt안에 들어가는 숫자다.
- Cost Factor는 bcrypt 의 작업 난이도를 의미하며, 숫자가 클수록 작업량이 늘어난다
- 숫자 12는 2의 12승(4096) 번의 해싱 라운드를 수행했음을 나타낸다.
- 일반적으로 10~12 사이의 Cost Factor가 많이 사용된다
- Salt 값 (ma/AkptpdrueOHy5PSjiMO):
- Salt는 해시를 더 안전하게 만들기 위해 사용된다
- bcrypt 는 해싱 과정에서 난수를 기반으로 고유한 Salt 값을 생성한다
- 이 Salt는 bcrypt 알고리즘에서 128비트(16바이트)로 이루어져 있다
- Hashed Password (W/Beg9PLH/kie7GB/KsI17dE5jujbeq):
- W/Beg9PLH/kie7GB/KsI17dE5jujbeq는 실제로 암호화된 해시 값, Salt와 Cost Factor를 조합해서 만들어낸 것이다
단방향 암호화란? 복호화가 불가능한 이유는?
단방향 암호화란 복호화가 불가능한 암호화를 의미한다. 한쪽으로는 암호화가 가능하지만 반대쪽으로 유추가 불가능하다는 뜻이다.
양방향 암호화
양방향 암호화는 복호화가 가능한 암호화이다. 비밀번호가 있고, 이 비밀번호를 암호화 하는 문서가 있다고 생각하면 된다
ex) a = c, b = d, c = e…….
이렇게 알파벳의 위치가 2개씩 밀린 암호문서가 있고, 이 문서를 가진 사람은 암호화된 문자열을 쉽게 복호화 할 수 있을 것이다.
단방향 암호화
하지만 해쉬함수를 여러 번 거친 문자열은 해쉬 함수의 일방향적 특정으로, 복호화가 불가능에 가깝다. 여기에 안정성을 더하기 위해 무작위 문자열인 Salt를 생성한다. 위의 예시처럼 salt값은 DB에 저장되어 있다.
Salt값을 안다면?
Salt값을 알면 아주 조금은 암호를 복호화하기 쉬워지겠지만 해쉬 함수의 특성으로 여전히 어렵다. 그래도 DB를 안전하게 보관해서 암호가 복호화되는 일이 없도록 해야한다,
Salt 값이 없는 암호화는 복호화가 가능할까?
만약 Salt값이 없고 해쉬함수를 수행하는 횟수를 알고 있다면, 통상적인 비밀번호의 경우 사람들이 모아놓은 데이터가 존재하기 때문에 복호하가 가능하다.
이 모아놓은 데이터들을 레인보우 테이블(Rainbow Table) 이라고 부른다
링크 : https://crackstation.net/
위와 같은 복호화 사이트가 존재한다
복호화가 가능한 암호 알고리즘
MD5 암호화 사이트
MD5 복호화 사이트
ex) qwer1234, abc123
위와 같은 비밀번호를 설정했고, Salt가 없는 암호화 알고리즘을 사용했다면 여러분의 비밀번호가 복호화되어 노출될 수 있다.
저런 암호화 알고리즘은 사용하지 않는 것이 좋다
'Walga' 카테고리의 다른 글
[Walga] AWS RDS 리전 변경(이전) 미국 동부 -> 서울 (0) | 2024.06.01 |
---|