1

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

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

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

在 WP 中,我这样设置密码,并得到一个哈希值:

P: alamakota
H:$P$BSrncAWIY2KU7waUGLzayaon6v3gKU1

当我尝试登录时,WP 说“没事,进来吧,伙计”

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

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

它说“酷,密码匹配!”

它也以另一种方式完美地工作。

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

情况和以前几乎一模一样,但我将把ą字符放入密码中并使用 WP 对其进行哈希处理:

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

同样,当使用 WP 进行验证时,它会显示“密码匹配!进来”。

不幸的是,当我尝试使用 node-phpass 比较密码时,它说“对不起,伙计,你不能通过”

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

它也不能以其他方式工作。

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

更新:

我刚刚发现当输入字符串中有国际字符时,PHP 的md5()函数和 JS'escrypto.createHash('md5')不会返回相同的哈希值。有什么解决办法吗?

4

1 回答 1

1

所以事实证明,由于字符编码,PHP 的md5()函数返回的哈希值与 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
于 2019-06-21T15:08:11.040 回答