일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 코딩
- clean code
- 소묘
- 코딩테스트
- 웹개발
- 미켈란젤로
- 알고리즘
- 그림
- 재택근무
- 파이썬
- 연필소묘
- leetcode
- PrivateRouter
- react
- IT자격증
- IT 자격증
- 연필
- 프로그래밍
- KSTQB
- 클린 코드
- 테스팅 자격증
- Kriss 재택
- 프로그래머스
- 취미
- 토익 환급
- 코드잇
- Python
- 다비드상
- 색연필
- csts
- Today
- Total
글모음
[ 웹 보안 ] bcrypt, crypto 본문
bcrypt, crypto
회원가입 / 로그인 / 비밀번호 찾기 서비스를 개발하는 중에 bcrypt와 crypto 모듈이 있다는 걸 알게 되었다.
두 모듈 모두 언뜻보면 비슷한 암호화 관련 라이브러리이지만, 각각의 용도와 특징이 달라서 정리하려고 한다.
[ bcrypt ]
bcrypt는 Blowfish(블로피시) 암호를 기반을 둔 암호화 해시 함수이다.
주로 비밀번호와 같은 민감한 정보를 암호화할 때 사용되고, 입력값을 고정된 길이의 출력값으로 변환해 준다.
이때, 입력값에 약간의 변화가 생겨도 출력값이 전혀 다르게 나오는 특징이 있어서 회원가입시 토큰 비교에도 사용된다.
입력값을 여러 번 반복해서 암호화하기 때문에 보안성이 매우 높다는 장점이 있지만, 안전한 암호화를 위해 암호화 속도가 느리다는 단점이 있음
[ crypto ]
crypto는 다양한 암호화 알고리즘을 제공하는 라이브러리.
bcrypt와 달리, 암호화의 범위가 넓어서 인증서나 키 관리 등에서 사용된다. (대칭키 암호화, 비대칭키 암호화, 해시 함수 등)
bcrypt와 달리 암호화 속도가 빠르다는 장점이 있다.
[ 어떤게 적합할까? ]
두 라이브러리는 각각의 사용 용도와 특징이 있으므로, 암호화 방식을 선택할 때에는 해당 용도에 맞게 선택해야 한다.
< 1. 비밀번호 찾기( 리셋 ) >
비밀번호 리셋 토큰의 목적은 일시적으로 사용자 인증을 제공하고, 비밀번호를 재설정하는 것이다. 이때는 crypto 모듈보다는 bcrypt를 쓰는 게 낫다고 한다.
1. 무작위 토큰 생성
crypto 모듈은 무작위 바이트를 생성하는 것이 쉽워서 고유한 임시 토큰도 빠르게 생성할 수 있다.
반면, bcrypt는 원래 비밀번호 해싱을 목적으로 설계되었기 때문에 무작위 토큰 생성에는 최적화되어 있지 않음
2. 토큰 길이
crypto 모듈을 사용하면, 생성된 토큰의 길이를 쉽게 조절할 수 있어서 사용자에게 보내는 이메일 링크를 간결하게 유지할 수 있음.
반면, bcrypt로 생성된 토큰은 일반적으로 길고 복잡한 문자열로 인해 비밀번호 찾기 시에는 사용자가 이용하게 어렵다.
3. 처리 속도: 비밀번호 해싱에 사용되는 bcrypt는 의도적으로 느리게 처리되도록 설계되어있음.
언뜻 들으면 이상하게 들리지만 비밀번호를 무차별 대입 공격(brute-force attack)으로부터 보호하기 위해서 느리게 설계되었다.
그래서 임시 토큰 생성을 하는 경우에는 빠른 처리 속도를 가진 crypto 모듈을 쓰는 게 낫다.
< 2. 회원 가입 시 비밀번호 저장 및 서버와 토큰 비교 >
해싱 알고리즘: bcrypt는 원래 비밀번호 해싱을 위해 설계된 알고리즘이며, 그 결과로 보안적으로 강력한 해시를 생성합니다. 반면, crypto 모듈은 여러 암호화 작업을 수행할 수 있는 범용 라이브러리이므로, 비밀번호 해싱에 특화되지 않았음
솔트(Salt) 사용: bcrypt는 자동으로 솔트를 생성하고 해시에 포함시켜 공격자가 미리 계산된 해시 테이블(레인보우 테이블 등)을 사용하는 것을 방지한다. 이 기능은 비밀번호 보안에 중요한 역할을 한다.
[ 결론 ]
bcrypt와 crypto는 각각 암호화에 특화된 라이브러리이다. 비슷해 보이지만 bcrypt는 보안성이 높고, 주로 비밀번호 등 민감한 정보를 암호화하는 용도로 사용되는 반면, crypto는 다양한 암호화 알고리즘을 제공하며, 주로 인증서나 키 관리 등에서 사용된다.
나 같은 경우엔 회원가입 시에 비밀번호 해싱, 백엔드에서 토큰을 비교하기 위해서는 bcrypt(bcrypt.js)를 썼고
비밀번호 리셋 토큰 생성과 같이 무작위 문자열이 필요한 경우에는 crypto를 사용했다.
'프로그래밍 공부 > 기타' 카테고리의 다른 글
[ Error ] Error: [PrivateRoute] is not a <Route> component.All component children of <Routes> must be a <Route> or <React.Fragment> (1) | 2023.03.20 |
---|---|
[웹개발] bcrypt와 bcryptjs 비교하기 - 암호화 라이브러리 (0) | 2023.03.16 |
[웹개발] Canvas API 다루면서 생긴 문제들 - globalCompositeOperation, resizing (0) | 2023.03.06 |
[독서] - Clean code / 2장 의미 있는 이름 (0) | 2022.04.25 |
[독서] - Clean code / 1장 깨끗한 코드 (0) | 2022.04.23 |