| 1 | /* |
| 2 | * @Author: nevin |
| 3 | * @Date: 2022-01-21 09:50:47 |
| 4 | * @LastEditors: nevin |
| 5 | * @LastEditTime: 2024-07-08 15:38:55 |
| 6 | * @Description: 认证模块-加密工具 |
| 7 | */ |
| 8 | import * as crypto from 'crypto'; |
| 9 | export interface Password { |
| 10 | password: string; // 密码 |
| 11 | salt: string; // 盐 |
| 12 | } |
| 13 | |
| 14 | /** |
| 15 | * 生成随机盐 |
| 16 | */ |
| 17 | function makeSalt(): string { |
| 18 | return crypto.randomBytes(3).toString('base64'); |
| 19 | } |
| 20 | |
| 21 | /** |
| 22 | * Encrypt password |
| 23 | * @param password 密码 |
| 24 | * @param salt 密码盐 |
| 25 | * @returns { |
| 26 | * password, // 加密的密码 |
| 27 | * salt |
| 28 | * } |
| 29 | */ |
| 30 | export function encryptPassword(password: string, salt?: string): Password { |
| 31 | if (!password) return null; |
| 32 | salt = salt || makeSalt(); |
| 33 | |
| 34 | // 10000 代表迭代次数 16代表长度 |
| 35 | password = crypto |
| 36 | .pbkdf2Sync(password, Buffer.from(salt, 'base64'), 10000, 16, 'sha1') |
| 37 | .toString('base64'); |
| 38 | return { |
| 39 | password, |
| 40 | salt, |
| 41 | }; |
| 42 | } |
| 43 | |
| 44 | /** |
| 45 | * 校验用户信息 |
| 46 | * @param userPassword 用户密码 |
| 47 | * @param userSalt 盐值 |
| 48 | * @param password 密码 |
| 49 | * @returns |
| 50 | */ |
| 51 | export function validatePassWord( |
| 52 | userPassword: string, |
| 53 | userSalt: string, |
| 54 | password: string, |
| 55 | ): boolean { |
| 56 | // 通过密码盐,加密传参,再与数据库里的比较,判断是否相等 |
| 57 | const { password: hashPassword } = encryptPassword(password, userSalt); |
| 58 | return userPassword === hashPassword; |
| 59 | } |
| 60 |