https://www.yuque.com/hello-pg8s3/ui9z3s/ay2dgi
Node - 017 - 使用 bcryptjs 對密碼做加密
bcrypt密碼圖解:

一、前言
用戶注冊時,如果不對密碼做一些加密處理直接明文存儲到數據庫中,一旦數據庫泄露,對用戶和公司來說,都是非常嚴重的問題。
二、使用 js-md5 包來加密
1. md5 簡介
MD5信息摘要算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼散列函數,可以產生出一個128位(16字節)的散列值(hash value),用於確保信息傳輸完整一致。
通常將128位MD5哈希表示為32位十六進制值。
2. 使用 js-md5
- 安裝:
$ npm install js-md5
- 引入使用
const md5 = require('js-md5') md5('123456') // e10adc3949ba59abbe56e057f20f883e
3. md5 加密的缺點
理論上是不能破解的,因為md5采用的是不可逆算法。
有的網站上提供MD5解密,是因為有大量的存儲空間來保存源碼和加密后的密碼,當解密時就是一個查詢的過程,稍微復雜點的查詢就無法完成。
這種解密方式,叫做 字典攻擊
三、bcryptjs
解決 字典攻擊 的方式是 加鹽。
bcryptjs 是 nodejs 中比較出色的一款處理加鹽加密的包。
1. 何為加鹽(Salt)
所謂加鹽,就是在加密的基礎上再加點“佐料”。這個“佐料”是系統隨機生成的一個隨機值,並且以隨機的方式混在加密之后的密碼中。
由於“佐料”是系統隨機生成的,相同的原始密碼在加入“佐料”之后,都會生成不同的字符串。
這樣就大大的增加了破解的難度。
如果加鹽還不行,還可以再來點味精、雞精、生姜、胡椒.....
2. 使用 bcryptjs
1. 安裝
$ npm install bcryptjs
2. 使用
// 引入 bcryptjs
const bcryptjs = require('bcryptjs')
// 原始密碼
const password = '123456'
/**
* 加密處理 - 同步方法
* bcryptjs.hashSync(data, salt)
* - data 要加密的數據
* - slat 用於哈希密碼的鹽。如果指定為數字,則將使用指定的輪數生成鹽並將其使用。推薦 10
*/
const hashPassword = bcryptjs.hashSync(password, 10)
/**
* 輸出
* 注意:每次調用輸出都會不一樣
*/
console.log(hashPassword) // $2a$10$P8x85FYSpm8xYTLKL/52R.6MhKtCwmiICN2A7tqLDh6rDEsrHtV1W
/**
* 校驗 - 使用同步方法
* bcryptjs.compareSync(data, encrypted)
* - data 要比較的數據, 使用登錄時傳遞過來的密碼
* - encrypted 要比較的數據, 使用從數據庫中查詢出來的加密過的密碼
*/
const isOk = bcryptjs.compareSync(password, '$2a$10$P8x85FYSpm8xYTLKL/52R.6MhKtCwmiICN2A7tqLDh6rDEsrHtV1W')
console.log(isOk)
