我有一个PHP脚本,可以为给定的字符串创建AES-256-CBF8加密。 我想在javascript中为相同的加密创建一个等效的代码。 我使用CryptoJS也是如此。但我的javascript和php的加密代码都有所不同。
我试过这个:
PHP:
$secret_key = 'qIthpcluB8xA4Y0CGS7ahl3kfluBay7p';
$secret_iv = '99FF8B0332880F69D14110316D640AFFA8F422311C1576AF055A00498A88EEE80D337FBB1E4B8081A0901E9A1750806B2B371E7438AB968E4C1C8D3EF05A81ED';
$output = false;
$encrypt_method = "AES-256-CFB8";
$key = hash( 'sha256', $secret_key );
$iv = substr( hash( 'sha256', $secret_iv ), 0, 16 );
if( $action == 'enc' )
{
$output = base64_encode( openssl_encrypt( $string, $encrypt_method, $key, 0, $iv ) );
}
else if( $action == 'dec' )
{
$output = openssl_decrypt( base64_decode( $string ), $encrypt_method, $key, 0, $iv );
}
else
{
return false;
}
return $output;
JavaScript的:
var message = '{"Request":"login","Username":"123456","API_AccessKey":"b57a4d91965d456","GMT_Timestamp":"101439"}';
var key = CryptoJS.SHA256("qIthpcluB8xA4Y0CGS7ahl3kfluBay7p"); //length=22
console.log(key);
var iv1 = CryptoJS.SHA256("99FF8B0332880F69D14110316D640AFFA8F422311C1576AF055A00498A88EEE80D337FBB1E4B8081A0901E9A1750806B2B371E7438AB968E4C1C8D3EF05A81ED"); //length=22
var iv = iv1.toString().substring(0,16);
var key1 = key.toString();
console.log(iv);
console.log(key);
//iv.substring(0,16);
//iv is now 987185c4436764b6e27a72f2fffffffd, length=32
var cipherData = CryptoJS.AES.encrypt(message, key1, { iv: iv },{mode: CryptoJS.mode.CFB8});
console.log(cipherData.toString());
//var cipherData="NUUyUDZPVGFLUzVCSUZpRUR3S28vN3dwY2ZLbjVTeDRDc25aTUdmS2pYc3VlTFBFWEpxVFVENmRIV1BCTUdxQXo4UHpOdTlqK2lqcXVNWlBZdTQvTlFlSW5CZnI5UHdiQ1ovNEhCUHU2KytyT3dyOCtrLzBmQT09";
var data = CryptoJS.AES.decrypt(cipherData.toString(), key1, { iv: iv },{mode: CryptoJS.mode.CFB});
console.log(data);
var NewCipher = CryptoJS.enc.Utf8.parse(cipherData);
document.getElementById("demo0").innerHTML = message;
document.getElementById("demo1").innerHTML = CryptoJS.enc.Base64.stringify(NewCipher);
document.getElementById("demo2").innerHTML = data;
//document.getElementById("demo3").innerHTML = CryptoJS.enc.Base64(data.toString(CryptoJS.enc.Utf8));
document.getElementById("demo3").innerHTML = data.toString(CryptoJS.enc.Utf8);
请帮助我。
答案 0 :(得分:1)
你应该依靠后端进行加密,这是更安全的方法。但是如果您非常关心使用AES256的安全性,那么应该使用已经在评论中说过的SSL,因为隧道和其他属性会显着提高您日常工作的安全性。
我知道网络上的客户端有很多例程,但使用它们并不好,客户端的缺陷与密码学的后端例程相比,数量超过了恕我直言。
有几个原因,包括以下内容:
将Javascript安全传送到浏览器是一个鸡蛋问题。
浏览器Javascript对加密技术持怀疑态度。
Javascript的“view-source”透明度是虚幻的。
在修复这些问题之前,Javascript并不是一个严重的加密 研究环境,并为之受苦。
关于SSL解决方案,它已经提供了比您自己的js例程更好的使用某种安全性:
你可以。它比听起来更难,但你安全地传输 Javascript使用SSL加密到浏览器。问题是,有 使用SSL建立安全通道,您不再需要Javascript 密码;你有“真正的”密码学。同时,Javascript 加密代码仍然受到其他浏览器问题的危害。