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

时间:2019-06-21 14:20:57

标签: php node.js wordpress phpass

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

现在,我想使用Node将用户密码与WP哈希进行比较。我在NPM上发现了node-phpass module,应该为密码哈希提供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的crypto.createHash('md5')不会返回相同的哈希。有什么解决办法吗?

1 个答案:

答案 0 :(得分:0)

因此,事实证明,由于字符编码,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