【Nest教程】Nest項目用戶密碼加密

正常狀況下,當用戶使用咱們的這個服務時,須要註冊,設置用戶名及密碼,因爲密碼屬於比較隱私的,因此在大部分狀況下,都須要對用戶的密碼進行加密。數據庫

其實,加密也比較簡單,爲何單獨分出來寫一篇,由於下面咱們須要講項目集成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

【Nest教程】Nest項目用戶密碼加密

相關文章
相關標籤/搜索