PHP与JS互相加密解密
注:在使用PHP这两个函数时切记一定要打开 openssl 扩展(如果你是宝塔面板用户就不用管了,默认是开启了的),另外还需引入核心 crypto-js 文件,否则JS部分会报错无法使用。
PHP部分代码
/**
* 加密字符串
* $data 字符串
* $key 加密key(16位)
* $iv 加密向量(16位)
* return string
*/
function encrypt($data, $key, $iv) {
$encrypted = openssl_encrypt($data, "AES-128-CBC", $key, true, $iv);
return base64_encode($encrypted);
}
/**
* 解密字符串
* return object
*/
function decrypt($data, $key, $iv) {
$decrypted = openssl_decrypt(base64_decode($data), "AES-128-CBC", $key, true, $iv);
$json_str = rtrim($decrypted, "\0");
return json_decode($json_str);
}
JS部分代码
/**
* 接口数据加密函数
* str 需加密的字符串
* key 加密key(16位)
* iv 加密向量(16位)
* return string 加密密文字符串
*/
function encrypt(str, key, iv) {
var key = CryptoJS.enc.Utf8.parse(key);
var iv = CryptoJS.enc.Utf8.parse(iv);
var encrypted = CryptoJS.AES.encrypt(str, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return encrypted;
}
/**
* 接口数据解密函数
* returns {*|string} 解密之后的字符串
*/
function decrypt(str, key, iv) {
var key = CryptoJS.enc.Utf8.parse(key);
var iv = CryptoJS.enc.Utf8.parse(iv);
var decrypted = CryptoJS.AES.decrypt(str, key, {
iv: iv,
padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8);
return decrypted;
}
实现方法、演示
这里演示一下PHP写入加密cookie、JS读取并解密
PHP部分
/**
* 加密字符串
* $data 字符串
* $key 加密key(16位)
* $iv 加密向量(16位)
* return string
*/
function encrypt($data, $key, $iv) {
$encrypted = openssl_encrypt($data, "AES-128-CBC", $key, true, $iv);
return base64_encode($encrypted);
}
$name = "mc"; //cookie名称
$data = "你好世界"; //要加密的字符串
$key = "f1hjd63id76d74j8"; //加密key(16位)
$iv = "k37f8h5y7sk37vh4"; //加密向量(16位)
$expire = time()+3600; //时间戳,秒数,cookie的过期时间
setcookie($name, encrypt($data, $key, $iv), $expire); // PHP写入加密cookie
JS部分
//js 获取 php 设置的 Cookie
getck = function(name) {
var arr = document.cookie.match(new RegExp("(^| )" + name + "=([^;]*)(;|$)"));
if (arr != null) {
return decodeURIComponent(arr[2]);
}
return null;
};
/* js 获取 php 设置的 Cookie(第二种方法)
getck = function(c_name) {
if (document.cookie.length > 0){
c_start = document.cookie.indexOf(c_name + "=");
if (c_start != -1){
c_start = c_start + c_name.length + 1;
c_end = document.cookie.indexOf(";", c_start);
if (c_end == -1){
c_end = document.cookie.length;
}
return unescape(document.cookie.substring(c_start, c_end));
}
}
return "";
};*/
/**
* 接口数据解密函数
* str 需加密的字符串
* key 加密key(16位)
* iv 加密向量(16位)
* returns {*|string} 解密之后的字符串
*/
function decrypt(str, key, iv) {
var key = CryptoJS.enc.Utf8.parse(key);
var iv = CryptoJS.enc.Utf8.parse(iv);
var decrypted = CryptoJS.AES.decrypt(str, key, {
iv: iv,
padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8);
return decrypted;
}
data = getck("mc"); //读取要解密的cookie并赋值给data,mc 为cookie名称
key = "f1hjd63id76d74j8"; //加密key(16位)
iv = "k37f8h5y7sk37vh4"; //加密向量(16位)
jmh_data = decrypt(data, key, iv); //JS解密 PHP写入的加密cookie,并赋值给jmh_data
其他
部分内容引用: