--- 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` 並取得加密後的密碼 範例: ![](https://i.imgur.com/iVkplJW.png =500x) ## 回報流程 將答案連結貼至底下回報就算完成了喔! 解答位置請參考下圖(需打開程式碼的部分觀看) ![](https://i.imgur.com/vftL5i0.png) <!-- 解答: ```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) |