---
# System prepended metadata

title: "\U0001F3C5 Day 26"
tags: [Node.js 直播班 - 2022 春季班]

---

---
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` 並取得加密後的密碼
範例
![](https://i.imgur.com/iVkplJW.png =500x)




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

![](https://i.imgur.com/QtL8zEW.png)

回報格式：請在「回報區」貼上 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) |


