我想使用我自己在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')
不会返回相同的哈希。有什么解决办法吗?
答案 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