网页端(在没有https情况下)给密码之类的加密传输,虽然多此一举,也好过直接监控软件就能看到密码
思路
在传输密码的时候,先向后台获取一个随机码或者验证码,作为秘钥,网页端根据这个秘钥,加密要传输的数据,服务端先验证验证码是否正确,如果验证正确,根据验证码进行数据解密
fox.风
PHP
class AesJs
{
/**向量
* @var string
*/
private static $iv = "1234567890123412";//16位
/**
* 默认秘钥
*/
const KEY = '1111111111111123';//16位
public static function init($iv = '')
{
self::$iv = $iv;
}
/**
* 加密字符串
* @param string $data 字符串
* @param string $key 加密key
* @return string
*/
public static function encrypt($data = '', $key = self::KEY)
{
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, self::$iv);
return base64_encode($encrypted);
}
/**
* 解密字符串
* @param string $data 字符串
* @param string $key 加密key
* @return string
*/
public static function decrypt($data = '', $key = self::KEY)
{
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($data), MCRYPT_MODE_CBC, self::$iv);
return rtrim($decrypted, "\0");
}
}
//调用
//加密
AesJs::encrypt('要加密的字符串','秘钥');
//解密
AesJs::decrypt('要解密的字符串','秘钥');
JS
下载地址:
1.https://code.google.com/archive/p/crypto-js/downloads
2.https://github.com/brix/crypto-js/tree/release-3.1.2 (build 目录下)
先加载js文件
<script src="crypto-js/rollups/aes.js" type="text/javascript"></script>
<script src="crypto-js/rollups/md5.js" type="text/javascript"></script>
<script src="crypto-js/components/pad-zeropadding-min.js" type="text/javascript"></script>
/**
* 加密
*/
function encrypt(str,key) {
key = CryptoJS.enc.Utf8.parse(key?key:"1111111111111111");// 秘钥
var iv= CryptoJS.enc.Utf8.parse('1234567890123412');//向量iv
var encrypted = CryptoJS.AES.encrypt(str, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.ZeroPadding });
return encrypted.toString();
}
/**
* 解密
* @param str
*/
function decrypt(str) {
var key = CryptoJS.enc.Utf8.parse("1111111111111111");// 秘钥
var iv= CryptoJS.enc.Utf8.parse('1234567890123412');//向量iv
var decrypted = CryptoJS.AES.decrypt(str,key,{iv:iv,padding:CryptoJS.pad.ZeroPadding});
return decrypted.toString(CryptoJS.enc.Utf8);
}
//调用
//加密
console.log(encrypt("12345"));
//解密
console.log(decrypt("待解密字符"));
实际使用
JS
//加密部分要改造一下
/**
* 加密
*/
function encrypt(str,key) {
key = CryptoJS.enc.Utf8.parse(CryptoJS.MD5(key).toString());//秘钥
var iv= CryptoJS.enc.Utf8.parse('1234567890123412');//向量iv
var encrypted = CryptoJS.AES.encrypt(str, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.ZeroPadding });
return encrypted.toString();
}
//验证码 转换成大写
var username=$('#username').val();//获取用户名
var pwd=$('#pwd').val();//获取密码
var verify=$('#verify').val();//获取验证码
verify = verify.toUpperCase();
var json = {username: username, pwd: pwd};//被加密的数据
var aes = encrypt(JSON.stringify(json), verify);//加密
var param = {verify: verify, param: aes};
$.post("/user/login?_=" + new Date().getTime(), param, function (data) {
if (data) {
...
} else {
....
}
}, "json");
PHP
$verify=input('verify');//验证码
$param=input('param');//加密后数据
//先转换成大写
//然后MD5
$json=AesJs::decrypt($param,md5(strtoupper($verify)));
echo $json;
$arr=json_decode($json,true);
print_r($arr);