我正在尝试在我的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函数,我真的很感激。
答案 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);
}