在日常项目中不免用到ajax异步请求数据,请求的数据以及服务器返回的数据就很容易被看到,这些数据也很无奈啊,不想被发现,却又赤裸裸的被展示出来。莫慌,最近小姑娘我新学习了一个加密解密的好方法--基于PHP和JS的AES相互加密解密方法。下载地址:()哈哈哈。。。

结果展示

AES加密发布到线上后的安全性 aes加密详解_PHP加密解密

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);
}