【问题标题】:How to verify a PHP hashed password in a NodeJS app如何在 NodeJS 应用程序中验证 PHP 哈希密码
【发布时间】:2020-03-04 20:57:38
【问题描述】:

我的应用程序在 PHP 上运行多年,我使用自 PHP 5.5 起推荐的 password hashing API 来存储我的用户密码。例如:

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

因此,我的数据库中充满了这样的密码:

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

现在我正在移动我的应用程序以在 NodeJS 12.3.0 而不是 PHP 上运行,我现在像这样使用 bcrypt library

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


    【解决方案1】:

    改用bcryptjs 包。它可以正确比较php生成的哈希。

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

    【讨论】:

    • 感谢您的提示!我今天将验证这一点。除了我的问题,您对在 Node 中使用 bcryptjs 而不是 bcrypt 的优缺点有任何见解吗?后者也很受欢迎但是3年没更新了
    • @BeetleJuice 抱歉,我没有更深入的知识。碰巧知道您要求的解决方案。去过那里,做到了。
    【解决方案2】:

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

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

    尝试进行以下更改:

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

    【讨论】:

    • 感谢您的建议。更改 PHP 代码对我没有帮助,因为所有密码都已经过哈希处理并存储在数据库中。问题是如何验证明文密码是否与 NodeJS 应用程序中现有的存储哈希匹配
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 2016-08-27
    相关资源
    最近更新 更多