---
tags: Node.js 直播班 - 2023 春季班
---
# 🏅 Day 25 - bcrypt.js 密碼加解密
**密碼加密**
使用 bcrypt.js 的 `hash()` 以非同步的方式將密碼加密
```javascript
bcrypt.hash(password,12);
// 第一個參數是要做雜湊加密的字串,第二個參數是要加鹽的字串長度
```
補充:
[雜湊(Hash function)](https://zh.wikipedia.org/zh-tw/%E6%95%A3%E5%88%97%E5%87%BD%E6%95%B8)為一種演算法,會將資料打亂建立雜湊值,雜湊值具有「不可逆」的性質(由此值回推原本的值非常困難),因此常用於密碼加密
[鹽(Salt)](https://zh.wikipedia.org/zh-tw/%E7%9B%90_(%E5%AF%86%E7%A0%81%E5%AD%A6))在密碼學中,是指在雜湊之前將雜湊內容(例如:密碼)的任意固定位置插入特定的字串。這個在雜湊中加入字串的方式稱為「加鹽」
**密碼解密**
密碼加密後,未來需要驗證是否為該註冊帳號就需以 `compare()` 將密碼與加密後的字串進行比對
```javascript
bcrypt.compare(password, user.password);
// 第一個參數是接收到的密碼,第二個參數是由資料庫找出的該 user 的密碼,為雜湊加密的字串
```
### 參考資源
- [bcrypt.js - hash](https://github.com/dcodeIO/bcrypt.js#hashs-salt-callback-progresscallback)
- [bcryptjs - compare](https://github.com/dcodeIO/bcrypt.js#compares-hash-callback-progresscallback)
### 題目(將答案寫在 GitHub 並提交至回報區)
測試註冊功能 POST `/users/sign_up`,使用[第五週專案](https://github.com/gonsakon/express-week4-sample/tree/week5) 練習(接下來會以此專案陸續練習第六週的內容)
- 於 models/user.js 加入使用者資料 schema,以儲存使用者 email 暱稱 密碼(可參考第六週[範例](https://github.com/gonsakon/express-week4-sample/blob/week6/models/usersModel.js))
- 安裝 [bcryptjs](https://www.npmjs.com/package/bcryptjs) 套件,使用 bcrypt.js 的 `hash()` 將 client 端傳送的密碼經過雜湊再儲存至資料庫
```javascript
router.post('/sign_up', handleErrorAsync(async(req, res, next) =>{
let { email, password, confirmPassword, name } = req.body;
// 加密密碼
password =
const newUser = await User.create({
email,
password,
name
});
res.status(200).json({
status: 'success',
data: newUser
});
}))
```
測試註冊 API `/users/sign_up` 並取得加密後的密碼
範例:

## 回報流程
將答案連結貼至底下回報就算完成了喔!
解答位置請參考下圖(需打開程式碼的部分觀看)

<!-- 解答:
```javascript=
範例參考 https://github.com/gonsakon/express-week4-sample/blob/week6/routes/users.js
// routes/users.js
router.post('/sign_up', handleErrorAsync(async(req, res, next) =>{
let { email, password, confirmPassword, name } = req.body;
// 加密密碼
password = await bcrypt.hash(password,12);
const newUser = await User.create({
email,
password,
name
});
res.status(200).json({
status: 'success',
data: newUser
});
}))
```
-->
回報區
---
| 報數 | 組別/Discord 名字 | Codepen/HackMD/其他回饋 |
|:----:|:-----------------------:|:-------------------------------------------------------------------------:|
| 1 | 中 4 組 / jimkk159 | [HackMD - Day 25](https://hackmd.io/AwXK9FLiSnOjlw28h-Gc5g) |
| 1 | 北 10 組 / Benson | [Github - Day 25](https://github.com/ioveasdkre/HexschoolOperation/tree/main/NodejsEnterpriseClass/day40-tasks/day25/app.ts) |
| 2 | 北 13 組 / Louisa | [GitHub - Day 25](https://github.com/louisa0416/NodejsEnterpriseClass/tree/master/daily-task/day25) |
| 4 | 北 16 組 / 文文 | [GitHub - Day 25](https://github.com/chiawen81/nodeJS_DailyTasks_d20/tree/4dffda71718e1348c696bcf3bfe074a0a2e53294) |
| 5 | 南 1 組 / hiYifang | [HackMD - Day 25](https://hackmd.io/@gPeowpvtQX2Om6AmD-s3xw/S1WEL_yPc) |