--- 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) |