正常狀況下,當用戶使用咱們的這個服務時,須要註冊,設置用戶名及密碼,因爲密碼屬於比較隱私的,因此在大部分狀況下,都須要對用戶的密碼進行加密。數據庫
其實,加密也比較簡單,爲何單獨分出來寫一篇,由於下面咱們須要講項目集成JWT,篇幅較長,因此把這個功能單獨拎出來。dom
1 編寫加密工具函數async
項目規範化,咱們在項目src目錄下新建utils文件夾,這裏面放工具函數,新建cryptogram.ts 文件,內容以下:ide
import * as crypto from 'crypto'; /** * Make salt */ export function makeSalt(): string { return crypto.randomBytes(3).toString('base64'); } /** * Encrypt password * @param password 密碼 * @param salt 密碼驗證 */ export function encryptPassword(password: string, salt: string): string { if (!password || !salt) { return ''; } const tempSalt = Buffer.from(salt, 'base64'); return ( // 10000 表明迭代次數 16表明長度 crypto.pbkdf2Sync(password, tempSalt, 10000, 16, 'sha1').toString('base64') ); }
文件內容比較簡單,兩個方法,一個是隨機字符串,一個是加密函數
2 使用工具
在user.service.ts文件導入this
// 引入加密函數 import { makeSalt, encryptPassword } from '../utils/cryptogram';
使用,用在更新及添加方法中,加密
// 增長/更新 async save(parameter: any): Promise<boolean | string> { Logger.log(`請求參數:${JSON.stringify(parameter)}`); // 判斷新增/更新 const user = await this.UserRepository.findOne({ where: { name: parameter.name, }, }); if (!parameter.id && user != undefined) { return '用戶名重複'; } const salt = makeSalt(); const hashPwd = encryptPassword(parameter.password, salt); parameter.password = hashPwd; parameter.passwdSalt = salt; try { let a = await this.UserRepository.save(parameter); return true; } catch (error) { Logger.log(`請求失敗:${JSON.stringify(error)}`); return false; } }
邏輯很簡單,就是無論是添加仍是修改,只要是用戶傳了密碼,就把密碼加密存進數據庫code
3 查看效果blog