如何在 NodeJS 应用程序中验证 PHP 哈希密码

问题描述 投票:0回答:3

我的应用程序在 PHP 上运行多年,从 PHP 5.5 开始,我使用推荐的 密码哈希 API 来存储我的用户密码。例如:

$password = password_hash("my password", PASSWORD_DEFAULT);

结果,我的数据库中充满了这样的密码:

$2y$10$sjzYz7g/kVxpJUynC/...........pjKPh0z1QuU.Mlt7TVAiPW

现在我正在移动我的应用程序以在

NodeJS 12.3.0
而不是 PHP 上运行,我现在使用
bcrypt
像这样:

const saltRounds = 10;
const password = await bcrypt.hash("my password", saltRounds);

相同的密码散列为:

$2b$10$SYZH5Mj4Dy8dkKyRv1O/.........XNGPVBe8nPJjpnEjPZxx.

我认为所用的算法、盐和圆都在弦内,这样过渡就会无缝。但是,当我尝试验证 PHP 存储的密码时,正确的密码无法验证:

// result === false
const result = await bcrypt.compare("my password", phpStoredHash);

我真的希望我不必强迫所有用户重设密码。我如何验证存储在我的

NodeJS
应用程序中的 PHP 密码?

php node.js hash passwords
3个回答
4
投票

使用 bcryptjs 包代替。它可以正确比较 php 生成的哈希值。

const bcrypt = require('bcryptjs')

const hashPHP = "$2y$10$Lsn001yN38WssfQmJ5hM5.Ywa3AKB76YD/zUC9QNS5BPRr9QMWOTa"
console.log(bcrypt.compareSync("my password", hashPHP));  // outputs: true

0
投票

当你使用 bcrypt.compareSync 需要

const bcrypt = require('bcryptjs')
使用这个 npm

npm 我 bcryptjs

let ifmatch = bcrypt.compareSync(密码, users.password);

      if (ifmatch == false) {
        res.status(401).send({
          message: "password not found",
          status: 0,
          result:ifmatch,
          err
        });
      }
      if (ifmatch == true) {
        res.status(200).send({
          message: "You are successfully logged in",
          users,
        });
      }

-1
投票

这没有任何盐轮,PASSWORD_DEFAULT 使用 BCRYPT

$password = password_hash("my password", PASSWORD_DEFAULT);

尝试进行以下更改:

$password = password_hash("my password", PASSWORD_BCRYPT);
© www.soinside.com 2019 - 2024. All rights reserved.