node项目前后端密码加密传输及存储方案
前端:使用crypto-js库的SHA256算法,包含用户注册时使用的邮箱加上自定义的secret key生成盐值,接着使用PBKDF2算法进行加密。
import CryptoJS from "crypto-js";
export const encryptPassword = (email: string, password: string): string => {
// 生成盐值
const SALT = CryptoJS.SHA256(
email,
import.meta.env.SECRET_KEY
).toString();
// 使用 PBKDF2 进行密码加密
const key = CryptoJS.PBKDF2(password, SALT, {
keySize: 256 / 32,
iterations: 1000,
});
return key.toString(CryptoJS.enc.Base64);
};
后端:创建用户时,使用bcryptjs的hashSync对密码进行哈希加密,并存入数据库。用户登录时,再用compareSync对密码进行解密。
import * as bcrypt from 'bcryptjs';
export class UsersService {
async create(createUserDto) {
// 创建新用户 - 进行哈希加密
const hashedPassword = bcrypt.hashSync(createUserDto.password, 10);
return //略
}
async validatePassword(user, password) {
try {
// 使用 bcrypt 比较原始密码和存储的哈希密码
return bcrypt.compareSync(password, user.passwordHash);
} catch (error) {
console.error('Password validation error:', error);
return false;
}
}
}
方案理由:
由于前端使用HTTPS进行数据传输,密码数据很难被窃取,即使被窃取,也只能获得加密后的密码。
而后端依然拥有最后一道防线,即使能够窃取数据库数据,破解bcrypt.hashSync生成的哈希值也是几乎无法完成的任务。