将PHP的crypt()函数转换为Node.js实现遇到问题求助
解决PHP crypt()到Node.js的哈希兼容问题
问题分析
你PHP代码里用的是SHA-512加密算法(由$6$标记),指定了迭代次数rounds=20000,固定盐值xtreamcodes。Node.js自带的crypto模块没有直接对应crypt(3)的SHA-512实现,需要用第三方库来匹配。
具体实现步骤
1. 安装依赖库
使用crypt3库,它直接实现了Unix crypt(3)函数,完美匹配PHP的crypt()行为:
npm install crypt3
2. 实现哈希生成与验证函数
替换你现有的密码处理逻辑,用crypt3生成和PHP一致的哈希,或直接验证输入密码与数据库存储的哈希:
const crypt3 = require('crypt3'); // 生成与PHP crypt()完全一致的哈希(用于测试或生成新哈希) function generatePHPCryptHash(password) { const salt = '$6$rounds=20000$xtreamcodes$'; return crypt3(password, salt); } // 验证输入密码是否匹配数据库中的哈希 function verifyPassword(inputPassword, storedHash) { // 直接用存储的哈希作为盐,crypt3会自动解析盐里的算法、迭代次数等参数 const generatedHash = crypt3(inputPassword, storedHash); return generatedHash === storedHash; }
3. 修正登录接口逻辑
原代码存在异步函数未加await、验证逻辑错误的问题,修改后的登录接口:
// Endpoint para login app.post('/login', async (req, res) => { const { username, password } = req.body; try { const user = await RegUser.findOne({ where: { username } }); if (!user) { return res.status(400).json({ error: 'Usuário ou senha incorretos' }); } // 验证密码 const isPasswordValid = verifyPassword(password, user.password); if (!isPasswordValid) { return res.status(400).json({ error: 'Usuário ou senha incorretos' }); } const token = jwt.sign({ id: user.id, username: user.username }, secretKey, { expiresIn: '1h' }); res.json({ message: 'Login bem-sucedido', token, success: true }); } catch (error) { console.error('Erro ao realizar login:', error); res.status(500).json({ error: 'Erro no servidor' }); } });
测试验证
当输入密码为admin时,调用generatePHPCryptHash('admin')会生成和你提供的完全一致的哈希:
$6$rounds=20000$xtreamcodes$XThC5OwfuS0YwS4ahiifzF14vkGbGsFF1w7ETL4sRRC5sOrAWCjWvQJDromZUQoQuwbAXAFdX3h3Cp3vqulpS0
内容的提问来源于stack exchange,提问作者Sabá12
相关产品推荐
相关产品推荐

