我正在为Google Apps脚本实施PHPass,但我正在努力使用Portable Hashes变量MD5迭代。
我们这样做的原因是我们需要能够为大量WordPress站点自动定期更改密码。我们需要生成可以直接插入数据库的哈希值。因此,我们的实现需要与便携式哈希的WordPress实现100%兼容(每个wp-includes / class-phpass.php)。
问题的关键在于MD5迭代; computeDigest返回Byte[]
,而输入需要String
,因此以下代码在与PHPass的兼容性方面给出了不良结果:
function genHash_(passwd,settings) {
var output = '';
var salt = settings.slice(4,12);
var count = 1 << itoa64_.indexOf(settings[3]);
var hash = genMD5_(bin2String_(salt) + passwd);
do {
hash = genMD5_(bin2String(hash) + passwd);
} while (--count);
output = settings.slice(0,12);
output += encode64_(hash,16);
return output;
}
function genMD5_(input) {
return Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, input);
}
function bin2String_(bin) {
return String.fromCharCode.apply(String,bin);
}
在PHP实现中(来自wp-includes / class-phpass.php):
$hash = md5($salt . $password, TRUE);
do {
$hash = md5($hash . $password, TRUE);
} while (--$count);
TRUE
导致md5
以原始二进制格式返回结果。 PHP字符串是100%二进制兼容的,因此这“正常”。
应用程序脚本实现的问题似乎是,但是你把它骰子,从computeDigest的输出转换为字符串不起作用。即使使用fromCharCode
填充字符串来获取哈希值,由于unicode转换,使用getCharAt
再次转换会产生不同的结果。
所以我或多或少断定这是computeDigest的限制,因此需要从Google进行更改。但是,如果有人有任何想法,我认为值得提问。
编辑:有人提到这可能是another question的副本,它与将computeDigest
的输出转换为字符串有关。虽然这是类似的,但它并不重复,因为解决方案需要在computeDigest的输出和输入之间进行二进制兼容。
编辑:我查看了使用this question中建议的Blob.getDataAsString()
的方法,但这在转换时遇到了类似的问题。