---
tags: Node.js 直播班 - 2022 春季班
---
# 🏅 Day 26
## 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` 並取得加密後的密碼
範例

回報流程
---
請同學依照下圖教學觀看解答、回報答案:

回報格式:請在「回報區」貼上 CodePen 或 HackMD 連結回報答案 (為了統計人數,請同學依序加上「報數」)
<!-- 解答
```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
});
}))
```
-->
回報區
---
| 報數 | 組別 / 名字 | codepen / hackMD / 其他回饋 |
| ---- | ---------------- | -------------------------------------------------- |
| 1 | 第 9 組 / 黃士桓 | [HackMD](https://hackmd.io/wGdaF3KpSK-UKoEnjaFZmQ) |
| 2 | 第 5 組 / Hazel | [HackMD@Hazel](https://hackmd.io/@hazelwu/day26) |
| 3 | 第 4 組 / 苡安 | [HackMD](https://hackmd.io/FfoDsG-9TVGLA4TeU9YTfQ) |
| 4 | 第 14 組|East | [HackMD](https://hackmd.io/iijw8mtHRKi71lx-Xz-Hew) |
| 5 | 第 9 組 / konstante |[HackMD](https://hackmd.io/O7I8Lf1cSVyAEvsDF4YlDA?view)|
| 6 | 第 4 組 / 小宥 |[HackMD](https://hackmd.io/It36TanKQ2O8GhNtGr6mMg)|
| 7 | 第 3 組 / hiYifang |[HackMD](https://hackmd.io/@gPeowpvtQX2Om6AmD-s3xw/S1WEL_yPc)|
| 8 | 第 11 組 / Han Lai |[HackMD](https://hackmd.io/S3SEPTY9R_m6BY-Du0wWag?view)|
| 9 | 第 2 組 / joe |[HackMD](https://hackmd.io/uaRTw9c0TgOrADyXMmGL0Q?view#513-bcryptjs)|
| 10 | 第 2 組 / Jin |[HackMD](https://hackmd.io/d5bAthpXSSSzm1D2_LFyjQ)|
| 11 | 第 3 組 / Hobby |[HackMD](https://hackmd.io/@hobbyling/day26)|
| 12 | 第 7 組 / jason06286 |[HackMD](https://hackmd.io/uSoJJUu8SR6GNPqmHKEgLg)|
| 13 | 第 12 組 / Jimmy |[HackMD](https://hackmd.io/TbjxJZroRpqHxjsO9iZObw)|
| 14 | 第 2 組 / wendy | [HackMD](https://hackmd.io/80FIwll1QUa4u0-WoBv-hQ#20220513) |
| 15 | 第 16 組 / 皓皓 | [HackMD](https://hackmd.io/@cutecat8110/rJ_7cFOcq) |