Skip to content

Commit

Permalink
Add new posts from Notion
Browse files Browse the repository at this point in the history
  • Loading branch information
KKardd committed Feb 12, 2025
1 parent 2a45586 commit ec895ca
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 1 deletion.
3 changes: 2 additions & 1 deletion notion-to-blog/posted_pages.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
"13b3f2d5-455b-80d7-9421-e30e9d1040f9",
"1443f2d5-455b-8020-af21-df4ca64abc15",
"1523f2d5-455b-8042-8074-e2843cdf3388",
"1923f2d5-455b-8040-9733-e98151aec4aa"
"1923f2d5-455b-8040-9733-e98151aec4aa",
"1973f2d5-455b-80e8-a8ee-c0ecda96d9e5"
]
}
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);
});
});
```

0 comments on commit ec895ca

Please sign in to comment.