js 实现 salt
生成随机 Salt
在JavaScript中生成salt通常使用加密安全的随机数生成器。crypto.getRandomValues()是浏览器环境中常用的方法,适合生成高熵值的salt。
function generateSalt(length = 16) {
const array = new Uint8Array(length);
window.crypto.getRandomValues(array);
return Array.from(array, byte => byte.toString(16).padStart(2, '0')).join('');
}
Node.js 环境生成 Salt
Node.js环境下可使用crypto模块的randomBytes方法,该方法专为加密操作设计:
const crypto = require('crypto');
function generateSalt(length = 16) {
return crypto.randomBytes(length).toString('hex');
}
Salt 的存储与使用
生成的salt需要与哈希后的密码一起存储。典型格式为[salt]:[hashed_password],验证时需重新提取salt进行哈希计算:
// 存储示例
const salt = generateSalt();
const hashedPassword = sha256(password + salt);
const storedValue = `${salt}:${hashedPassword}`;
// 验证示例
const [extractedSalt, storedHash] = storedValue.split(':');
const computedHash = sha256(inputPassword + extractedSalt);
const isValid = computedHash === storedHash;
注意事项
- 长度建议:salt长度至少16字节(32位十六进制字符),关键系统建议32字节。
- 避免复用:每个用户/每次密码更改都应生成新salt。
- 编码格式:十六进制(hex)或Base64是常见存储格式,避免直接存储二进制数据。
前端与后端的协作
纯前端salt生成存在安全局限,建议:

- 前端生成临时salt用于传输过程保护
- 后端最终存储时使用服务端生成的salt
- 双层哈希可结合客户端与服务端salt增强安全性






