当密码中包含国际字符时,Phpass 的 WP 和 Node 实现不匹配

WP and Node implementations of Phpass does not match when there are international characters in the password

我想使用我自己用 Node.js 编写的身份验证服务对 WP 用户进行身份验证。我有用户保存在wp_userstable。他们的密码由 WordPress 使用 Phpass 方法进行哈希处理。当用户尝试登录他的帐户时,WP 使用 CheckPassword() 方法和 returns 布尔值 true/false 如果密码匹配或不匹配。

现在我想使用 Node 将用户密码与 WP 哈希进行比较。我在 NPM 上找到 node-phpass module,它应该提供用于密码哈希的 Phpass 算法。

在我使用国际字符之前一切都很好。这是一个例子:

在WP中,我这样设置密码,得到一个hash:

P: alamakota
高:$P$BSrncAWIY2KU7waUGLzayaon6v3gKU1

当我尝试登录时,WP 显示 "All fine, come in, man"

现在,我获取哈希值并尝试使用 node-phpass 模块对其进行验证:

const hasher = new PasswordHash(8, true, 7);
const valid = hasher.CheckPassword('alamakota', '$P$BSrncAWIY2KU7waUGLzayaon6v3gKU1');
console.log(valid); // => true

它说 "Cool, password match!"

它在其他方面也能完美运行。

现在,您可能会问问题出在哪里?这里:

情况几乎和以前完全一样,但我会把ą字符放在密码中并使用WP:

散列

P: alamakotą
高:$P$B6kY.rneyNwdPvAgd0lDq6oYv82XOd1

同样,当使用 WP 验证时,它显示 "Password match! Come in."

不幸的是,当我尝试使用 node-phpass 比较密码时,它显示 "Sorry, man, you shall not pass":

const hasher = new PasswordHash(8, true, 7);
const valid = hasher.CheckPassword('alamakotą', '$P$B6kY.rneyNwdPvAgd0lDq6oYv82XOd1');
console.log(valid); // => false

换个方式也行不通。

为什么会这样?密码中有国际字符,为什么我不能在Node.js中使用WP hash?

更新:

我刚刚发现 PHP 的 md5() 函数和 JS 的 crypto.createHash('md5') 没有 return 在有国际字符时相同的散列输入字符串。有解决办法吗?

所以结果是 PHP 的 md5() 函数 returns 与 JS 的 crypto.createHash('md5') 不同的散列,因为字符编码。在将密码与哈希值进行比较之前,我使用了 utf8,一切都按预期工作:

const utf8 = require('utf8');
const hasher = new PasswordHash(8, true, 7);
const valid = hasher.CheckPassword(utf8.encode('alamakotą'), '$P$B6kY.rneyNwdPvAgd0lDq6oYv82XOd1');
console.log(valid); // => true