在日常项目中不免用到ajax异步请求数据,请求的数据以及服务器返回的数据就很容易被看到,这些数据也很无奈啊,不想被发现,却又赤裸裸的被展示出来。莫慌,最近小姑娘我新学习了一个加密解密的好方法--基于PHP和JS的AES相互加密解密方法。下载地址:()哈哈哈。。。
结果展示
encrypt.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>基于PHP和JS的AES相互加密解密方法详解(CryptoJS)</title>
<meta name="keywords" content="JUNZHE.WANG,基于PHP和JS的AES相互加密解密方法详解,AES加密解密">
<meta name="description" content="基于PHP和JS的AES相互加密解密方法详解,AES加密解密,PHP开发,ZHIHUA· WEI">
<meta name="author" content="JUNZHE.WANG">
<link rel="stylesheet" href="">
<script src="lib/aes/rollups/aes.js"></script>
<script src="lib/aes/components/pad-zeropadding.js"></script>
<script src="js/jquery-1.11.0.min.js"></script>
<script src="js/function.js"></script>
</head>
<body>
<div style="margin:0 auto;text-align:center">
<h2>基于PHP和JS的AES相互加密解密方法详解(CryptoJS)</h2>
</div>
<div style="margin:0 20%;">
请登录<br>
用户名:<input type="text" name="username" /><br>
密 码:<input type="password" name="password" autocomplete="off" /><br>
<input type="submit" id="submit" value="提交">
</div>
<div style="margin:0 20%;">
<h4>加密测试:</h4>
<ul>
<li id="encrypt"></li>
<li id="encrypt_key"></li>
<li id="encrypt_string"></li>
</ul>
</div>
<div style="margin:0 20%;">
<h4>后台返回数据解密:</h4>
<ul>
<li id="decrypt_key"></li>
<li id="decrypt_value"></li>
<li id="decrypt_string"></li>
</ul>
</div>
<script>
//获取当前时间戳13位 + 3位字符
var timestamp = new Date().getTime().toString() + "WJZ";
//加密密钥16位
var encrypt_key = timestamp;
//加密向量16位
var iv = 'JMXIAOZHE_JUNZHE';
$('#submit').click(function() {
// 获取数据:
var username = $('input[name=username]').val();
var password = $('input[name=password]').val();
var info = new Object();
info.username = username;
info.password = password;
//要加密的数据
var encrypt_string =JSON.stringify(info);
$('#encrypt').text('进行加密的数据(字符串类型):' + encrypt_string)
//加密后密文(加密函数在function.js文件中)
var encrypted_string = encrypt(encrypt_string, encrypt_key, iv);
// 将加密数据传给后台获取用户信息
$("#encrypt_key").text("JS加密密钥:" + encrypt_key);
$("#encrypt_string").text("JS加密后字符串:" + encrypted_string);
encrypted_string = encrypted_string.toString();// encrypt() 函数返回的数据为对象,不是字符串类型,直接赋值给value会报错,所以一定要执行这一步;
$.ajax({
type: "post",
url: "index.php",
data: {
key: encrypt_key,
value: encrypted_string,
},
success: function(info) {
let datas = JSON.parse(info);
if(parseInt(datas.code) == 0) {
alert(datas.msg);
return false;
} else {
//解密密钥16位(解密向量同上)
var decrypt_key = datas.key;
//解密密文字符串
var decrypt_string = datas.value;
var decrypted_string = decrypt(decrypt_string, decrypt_key, iv);
$("#decrypt_key").text("解密的密钥(PHP端生成):" + decrypt_key);
$("#decrypt_value").text("解密的密文字符串(PHP端生成):" + decrypt_string);
$("#decrypt_string").text("JS解密后字符串:" + decrypted_string);
}
},
error: function(msg) {
console.log(msg);
}
})
});
</script>
</body>
</html>
index.php
<?php
/**
* ===============================================
* Created by JUNZHE.WANG
* Author: JUNZHE.WANG
* Date: 2019/01/01
* Time: 11:20
* Project: 基于PHP和JS的AES相互加密解密方法详解(CryptoJS)
* Power: php code
* ===============================================
*/
header("Content-type:text/html;charset=utf-8");
//加密向量16位
$iv = "JMXIAOZHE_JUNZHE";
//********************************解密ajax请求数据**********************************
//js加密秘钥16位
$decrypt_key = $_POST['key'];
//js加密密文字符串
$decrypt_data = $_POST['value'];
$decrypted = decrypt($decrypt_data, $decrypt_key, $iv);//返回结果格式为对象
//解密结果
$username = $decrypted->username;
$password = $decrypted->password;
// 获取用户信息
$user_info = get_user_info($username,$password);
$return_data = array();
if(empty($user_info)){
$return_data['code'] = 0;
$return_data['msg'] = '用户不存在';
}else{
// 判断用户密码是否正确
if(md5(md5($password).$user_info[1]) != $user_info[2]){
$return_data['code'] = 0;
$return_data['msg'] = '密码不正确';
}else{
//********************************加密**********************************
//PHP加密秘钥16位
$encrypt_key = date("YmdHis") . "WB";
//PHP加密数据
$arr = array('uid' => $user_info[0]);
//转换成json字符串
$encrypt_data = json_encode($arr);
$encrypted = encrypt($encrypt_data, $encrypt_key, $iv);
//加密结果
//********************************结束**********************************
$return_data['code'] = 1;
$return_data['key'] = $encrypt_key;
$return_data['value'] = $encrypted;
}
}
exit(json_encode($return_data));
//exit;
//********************************结束**********************************
function get_user_info($username,$pwd)
{
$mysqli = mysqli_init();
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 2);//设置超时时间
$mysqli->real_connect('localhost', 'root', 'root', 'geniuel');
$sql = "SELECT uid,factor,password FROM gn_member WHERE `username` = '$username'";
$result = $mysqli->query($sql);
#获取所有字段的信息
$row=$result->fetch_row();
return $row;
}
//******************************集成函数********************************
/**
* 加密字符串
* @param string $data 字符串
* @param string $key 加密key
* @param string $iv 加密向量
* @return string
*/
function encrypt($data, $key, $iv)
{
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
return base64_encode($encrypted);
}
/**
* 解密字符串
* @param string $data 字符串
* @param string $key 加密key
* @param string $iv 加密向量
* @return object
*/
function decrypt($data, $key, $iv)
{
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($data), MCRYPT_MODE_CBC, $iv);
$json_str = rtrim($decrypted, "\0");
return json_decode($json_str);
}