NodeJS Bcrypt比对Invision Community存储的哈希密码始终返回false
bcrypt比对Invision Community生成的密码哈希始终返回false的原因及解决方案
- 哈希前缀不兼容(最高概率)
Invision Community为PHP开发的程序,PHP的bcrypt实现生成的哈希默认使用$2y$前缀,而Node.js生态主流bcrypt包默认仅识别$2a$、$2b$前缀的哈希,遇到$2y$前缀时会直接判定校验失败。
修复方法为比对前替换哈希前缀:const originalHash = "$2y$10$IPu20eKbJ1I7WcsWnuSq1u9NlcYhVRgdUWSHoENNH2fguhca8K2py" // 替换前缀为bcrypt包兼容的格式 const compatibleHash = originalHash.replace(/^\$2y\$/, '$2a$') const isValid = await bcrypt.compare("Test123123", compatibleHash) - 明文密码存在多余字符
接收POST请求的密码参数时,可能存在未处理的前后空白、换行符,或者参数解析时意外拼接了多余字符,比对前可先对明文密码执行trim()处理。 - 数据库哈希值异常
检查Prisma Schema中用户密码字段的长度配置:bcrypt生成的哈希固定长度为60位,若字段长度小于60会导致存储时哈希被截断,校验必然失败。同时确认查询逻辑取到的确实是目标用户的哈希,不存在查询错位、转义字符破坏哈希结构的问题。 - bcrypt包版本兼容问题
过低版本的Node.jsbcrypt包存在算法实现差异,可升级到最新稳定版,或切换到纯JS实现、兼容性更好的bcryptjs包进行校验。
内容的提问来源于stack exchange,提问作者StreY
相关产品推荐
相关产品推荐

