当密码中包含国际字符时,Phpass 的 WP 和 Node 实现不匹配
WP and Node implementations of Phpass does not match when there are international characters in the password
我想使用我自己用 Node.js 编写的身份验证服务对 WP 用户进行身份验证。我有用户保存在wp_users
table。他们的密码由 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
我想使用我自己用 Node.js 编写的身份验证服务对 WP 用户进行身份验证。我有用户保存在wp_users
table。他们的密码由 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