-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
74 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
--- | ||
layout: post | ||
title: "여러분의 bcrypt는 안녕하십니까?" | ||
description: > | ||
hide_last_modified: true | ||
--- | ||
|
||
# 여러분의 bcrypt는 안녕하십니까? | ||
|
||
--- | ||
|
||
bcrypt는 암호화할 때 주로 사용하는 해싱 함수입니다. 보통은 비밀번호를 저장할 때 bcrypt를 사용해서 해싱하는 경우가 많죠! | ||
|
||
우선, 특징부터 살펴볼까요? | ||
|
||
### **bcrypt의 특징** | ||
1. Slow Hashing (느린 해싱) | ||
- 빠른 해싱 알고리즘(SHA-256, MD5)과 다르게 bcrypt는 의도적으로 연산을 느리게 만듦. | ||
- 브루트포스 공격(무차별 대입 공격)에 대한 저항성이 높음. | ||
2. Salt 적용 (랜덤 값 추가) | ||
- 같은 비밀번호라도 항상 다른 해시값을 생성하여 레인보우 테이블 공격을 방어함. | ||
3. Cost Factor (작업량 조절 가능) | ||
- 해시 연산 횟수를 조정할 수 있어서, 시간이 지나면서 보안성을 강화할 수 있음. | ||
4. Blowfish 기반 | ||
- Blowfish 암호화 알고리즘을 기반으로 만들어졌으며, 보안성이 뛰어남. | ||
5. **C언어 기반의 알고리즘** | ||
위와 같은 특징을 가지고 있고, 제가 다루고 싶은 부분은 5번의 ‘C언어 기반의 알고리즘’입니다. | ||
|
||
### **C언어 기반의 알고리즘** | ||
- **원래** **`bcrypt`** **알고리즘은 C로 개발됨.** | ||
- `bcrypt` 자체는 **OpenBSD에서 개발된 암호화 해시 알고리즘**으로, 초기 구현은 C 언어로 작성됨. | ||
- 놀랍게도, 많은 시스템(리눅스, 윈도우 등)에서 C 기반 라이브러리를 제공하여 이를 바탕으로 사용하고 있음. | ||
| **언어/프레임워크/런타임** | **bcrypt 구현 방식** | | ||
| --------------------- | ------------------------------------- | | ||
| Spring Boot (Java) | Java로 직접 구현 (`BCryptPasswordEncoder`) | | ||
| Node.js (`bcrypt`) | C++ 네이티브 모듈 | | ||
| Node.js (`bcryptjs`) | 순수 JavaScript 구현 | | ||
| Python (`bcrypt`) | C 기반 라이브러리 사용 | | ||
| PHP (`password_hash`) | C 기반 내장 함수 사용 | | ||
| Ruby (`bcrypt-ruby`) | C 기반 확장 라이브러리 사용 | | ||
| Go (`bcrypt`) | 순수 Go언어로 구현 | | ||
|
||
### 뭐가 문제가 되는데요? | ||
1. 네이티브 언어로 구현되지 않고, 라이브러리를 타 언어로 구사한 경우 언어 특성에 따라 오류가 나기 쉬워요. | ||
- C++을 사용하는 Node.js의 bcrypt는 타입안정성의 무리가 생겨요. 어쩔 수 없이 any를 사용하게 되는 경우도 있더라구요…! (@types 설치 했습니다 ㅠ) | ||
2. 인프라에 해당 언어도 설치되어 있어야한다는 점이 있어요. | ||
- Node.js로 서버를 구동하는 환경에서 bcrypt때문에 C++을 설치한다는 건 리소스 낭비죠? | ||
### 어떻게 해야하는데요? (Node.js) | ||
|
||
Java와 Go는 순수 언어로 구현되어 있기에 신경 안쓰셔도 됩니다. 다만, node.js에서는 `bcryptjs` 를 권장합니다. | ||
|
||
`bcryptjs`는 8년전에 만들어두고 아직까지 한번도 라이브러리가 publish 된 적 없지만,,, 1년전에 publish된 `bcrypt` 보다 안정성이 뛰어난 게 사실인 거 같습니다. (~~암호화 알고리즘이 자주 이슈가 생겨 업데이트 되는 것도 이상하지 않나요?~~) | ||
|
||
다행히, `bcrypt` 와 `bcryptjs` 는 똑같은 함수, 똑같은 문법, 똑같은 파라미터를 받습니다. | ||
|
||
본인이 `bcrypt` 를 사용했다 하더라도, 뚝딱 바꿀 수 있습니다😊 | ||
|
||
```typescript | ||
import * as bcrypt from 'bcrypt'; // 이거 대신 | ||
import * as bcrypt from 'bcryptjs'; // 요렇게만 바꿔도 똑같이 작동해요! | ||
const saltRounds = 10; | ||
const password = "my_secure_password"; | ||
bcrypt.hash(password, saltRounds, (err, hash) => { | ||
if (err) throw err; | ||
console.log("해싱된 비밀번호:", hash); | ||
// 비밀번호 검증 | ||
bcrypt.compare(password, hash, (err, result) => { | ||
if (err) throw err; | ||
console.log("비밀번호 일치 여부:", result); | ||
}); | ||
}); | ||
``` |