Javascript PHPass MD5可移植哈希的应用程序脚本实现
我正在为谷歌应用程序脚本开发PHPass的一个实现,但我正在为可移植散列变量MD5迭代而挣扎 我们这样做的原因是我们需要能够为大量WordPress站点自动执行常规密码更改。我们需要生成可以直接插入数据库的哈希。因此,我们的实现需要与WordPress实现的每个wp includes/class-phpass.php的可移植哈希100%兼容 问题的关键在于MD5迭代;computeDigest返回字节[],而输入需要字符串,因此以下代码在与PHPass的兼容性方面给出了不理想的结果:Javascript PHPass MD5可移植哈希的应用程序脚本实现,javascript,wordpress,hash,google-apps-script,md5,Javascript,Wordpress,Hash,Google Apps Script,Md5,我正在为谷歌应用程序脚本开发PHPass的一个实现,但我正在为可移植散列变量MD5迭代而挣扎 我们这样做的原因是我们需要能够为大量WordPress站点自动执行常规密码更改。我们需要生成可以直接插入数据库的哈希。因此,我们的实现需要与WordPress实现的每个wp includes/class-phpass.php的可移植哈希100%兼容 问题的关键在于MD5迭代;computeDigest返回字节[],而输入需要字符串,因此以下代码在与PHPass的兼容性方面给出了不理想的结果: funct
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);
}
TRUE会导致md5以原始二进制格式返回结果。PHP字符串是100%二进制兼容的,所以这“很有效”
应用程序脚本实现的问题似乎是,无论你如何处理它,从computeDigest输出到字符串的转换都不起作用。即使您使用fromCharCode填充字符串以获得哈希值,由于unicode转换,使用getCharAt再次转换也会产生不同的结果
因此,我或多或少地得出结论,这是computeDigest的一个限制,因此需要对Google进行更改。但如果有人有任何想法,我认为这个问题值得一提
编辑:有人提到,这可能是与将computeDigest的输出转换为字符串相关的复制。虽然这是类似的,但它不是重复的,因为解决方案要求computeDigest的输出和输入之间具有二进制兼容性
编辑:我已经研究了中建议的使用Blob.getDataAsString的方法,但在转换时也遇到了类似的问题。可能的重复不是重复,因为它涉及到将二进制兼容哈希反馈到computeDigest函数,而不仅仅是将其转换为字符串。对不起,看起来很相似。另一个有用吗?刚刚尝试了一下,我觉得它看起来有很好的解决方案的潜力,所以谢谢你。不幸的是,它也面临同样的问题——无法获得兼容的哈希。当散列失败时,我会在每次迭代中查看md5的输出。我通过将输出字节[]转换为字符串,然后再转换回来并比较结果来进行测试。结果字节数组的不同之处在于负数错误,我假设这是由于MSB被用作UTF-8/Unicode编码的一部分。无论如何我都不是那方面的专家!我提供的两个链接不能合并吗?使用我可能重复的链接答案处理负数,然后使用我的另一个链接使用blob将其转换为二进制。我也不是专家,也没有多少时间去研究它,但这两个答案在我的s.o.人头指数中都敲响了警钟
$hash = md5($salt . $password, TRUE);
do {
$hash = md5($hash . $password, TRUE);
} while (--$count);