PHPass MD5便携式哈希的Apps脚本实现

时间:2015-05-22 13:52:15

标签: javascript wordpress hash google-apps-script md5

我正在为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()的方法,但这在转换时遇到了类似的问题。

0 个答案:

没有答案