在网页中实现对称加密传输

HTTPS协议一般情况是没有必要采取加密,如果表单数据提交到网站上不使用HTTPS协议,数据就会有被第三方窃取的可能。在HTTP环境下无法保证数据的安全,使用加密和签名可以在一定程度上提高安全,减少数据泄露破解的可能性。
接下来说前后端使用AES来进行对称加密:

高级加密标准(Advanced Encryption Standard,AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

在前端上,javascript是没有关于密码和签名算法的函数的,这就需要自己写一套方法,目前现成有CryptoJs插件可以直接实现,在github上可以搜索下载
只需在head引用CryptoJs的AES.js文件,然后创建两个函数即可

ps:创建的函数是使用aes的CBC模式,Pkcs7填充,128bit加密

function aes_encode(data,key,iv){//加密
    var key  = CryptoJS.enc.Utf8.parse(key);
    var iv   = CryptoJS.enc.Utf8.parse(iv);
    var encrypted = CryptoJS.AES.encrypt(data,key,
        {
            iv:iv,
            mode:CryptoJS.mode.CBC,
            padding:CryptoJS.pad.Pkcs7
        });
    return encrypted.toString();
}
function aes_decode(encrypted,key,iv){//解密
    var key  = CryptoJS.enc.Utf8.parse(key);
    var iv   = CryptoJS.enc.Utf8.parse(iv);
    var decrypted = CryptoJS.AES.decrypt(encrypted,key,
        {
            iv:iv,
            mode:CryptoJS.mode.CBC,
            padding:CryptoJS.pad.Pkcs7
        });
    return decrypted.toString(CryptoJS.enc.Utf8);
}

使用加密/解密时,使用方法如下:

aes_encode('hello world','1234567812345678','1234567812345678');//a2SpM37nvVYtBnVHonX86w==
aes_decode('a2SpM37nvVYtBnVHonX86w==','1234567812345678','1234567812345678');//'hello world'
//iv要求至少16字节,pw经过测试值为8的整数倍字节才有效

在后端上,php自带了加密支持扩展库,可以直接调用使用:

在linux系统中或windows php版本小于5.3需要事先手动更改php.ini开启扩展

function aes_decode($data,$pw,$iv){//$data=>base64 data
    $temp=base64_decode($data);
    return mcrypt_decrypt(MCRYPT_RIJNDAEL_128,$pw,$temp,MCRYPT_MODE_CBC,$iv);
}
function aes_encode($input,$key,$iv){
    $size=mcrypt_get_block_size(MCRYPT_RIJNDAEL_128,MCRYPT_MODE_CBC);
    $pad=$size-(strlen($input)%$size);
    $input=$input.str_repeat(chr($pad), $pad);
    $td=mcrypt_module_open(MCRYPT_RIJNDAEL_128,'',MCRYPT_MODE_CBC,'');
    mcrypt_generic_init($td,$key,$iv);
    $data=mcrypt_generic($td, $input);
    mcrypt_generic_deinit($td);mcrypt_module_close($td);
    return base64_encode($data);
}

加密/解密时,使用方法等同于前端
在项目中使用尽量要保证数据加密安全,避免中间人依靠窃取而破解消息内容

猜你喜欢

转载自www.cnblogs.com/bobodesu/p/10613935.html