如何在WinJS中重写这些php散列函数?

时间:2013-12-03 17:34:33

标签: windows winjs

我正在尝试在我的Html5 + Javascript Windows应用程序中重新创建以下php函数:

function ComputeHash($plaintext,$salt){
    $plainTextNSalt=$plaintext.$salt;
    $signatureData=hash("sha256",mb_convert_encoding($plainTextNSalt,"UTF-16LE"),true);
    $saltData=mb_convert_encoding($salt,"UTF-16LE");
    $tmpStr=$signatureData.$saltData;
    $hashWithSalt=base64_encode($signatureData.$saltData);
    return $hashWithSalt;
}


 function VerifyHash($plaintext,$goodHash){
    $rtnFlg=false;
    $hashWithSalt=base64_decode($goodHash);
    $salt=mb_convert_encoding(substr($hashWithSalt,32,strlen($hashWithSalt)),"UTF-8","UTF-16LE");
    $expectedHashStr=ComputeHash($plaintext,$salt);
    $rtnFlg=($goodHash==$expectedHashStr);
    return $rtnFlg;
}

如果有人能想出两个等效的WinJS Javascript函数,我真的很感激。

1 个答案:

答案 0 :(得分:1)

嗯,你必须在那里替换一些不同的功能:

哈希算法很棘手,因为JS本身没有这些功能。你可以使用类似crypto-js之类的东西。

对于base64编码,您可以使用btoa()atob() - see this answer获取相关信息。

现在,将字节编码为UTF-16LE将是最困难的部分......我不知道如何做到这一点。如果你必须支持,你可能需要做一些挖掘。另一方面,如果您可以忽略该要求或使用其他内容,那么您可以使用类似下面的内容......

function computeHash(plaintext, salt){
    var plainTextNSalt = plaintext + salt;
    // note the lack of something to replace "mb_convert_encoding()" below...
    var signatureData = CryptoJS.SHA3(plainTextNSalt, { outputLength: 256 });
    return btoa(signatureData + salt);
}

function verifyHash(plaintext, goodHash){
    var hashWithSalt = atob(goodHash);
    // note the lack of something to replace "mb_convert_encoding()" below...
    var salt = hashWithSalt.substr(32, hashWithSalt.length);
    var expectedHashStr = computeHash(plaintext, salt);
    return (goodHash === expectedHashStr);
}