网页端(在没有https情况下)给密码之类的加密传输,虽然多此一举,也好过直接监控软件就能看到信息
PHP端
/** * 前台加密(对应JS解密) * @param $data * @param $key * @param $iv * @return string */ function js_encrypt($data,$key,$iv){ $data = openssl_encrypt($data,"AES-128-CBC",$key,true,$iv); return base64_encode($data); } /** * 前台解密(对应JS加密) * @param $data * @param $key * @param $iv * @return string */ function js_decrypt($data,$key,$iv){ $data = openssl_decrypt(base64_decode($data),"AES-128-CBC",$key,true,$iv); $data = rtrim($data,"\0"); return json_decode($data,true); }
后端使用
$str = "要加密的文本信息,如果是对象,请转换成文本"; $key = "52c7f81cd24c9699";//16位加密key $iv = "42e07d2f7199c35d";//16位偏移量 //加密成密文 $new_str = js_encrypt($str,$key,$iv); var_dump($new_str); //解密成原文 $old_str = js_decrypt($new_str,$key,$iv); var_dump($old_str);
16位偏移量可以用通过时间戳+随机数转16位小写的md5实现
前端
/** * 接口数据加密函数 * @param str string 需加密的json字符串 * @param key string 加密key(16位) * @param iv string 加密向量(16位) * @return string 加密密文字符串 */ function js_encrypt(str, key, iv) { //密钥16位 key = CryptoJS.enc.Utf8.parse(key); //加密向量16位 iv = CryptoJS.enc.Utf8.parse(iv); let encrypted = CryptoJS.AES.encrypt(str, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); return encrypted.toString(); } /** * 接口数据解密函数 * @param str string 已加密密文 * @param key string 加密key(16位) * @param iv string 加密向量(16位) * @returns {*|string} 解密之后的json字符串 */ function js_decrypt(str, key, iv) { //密钥16位 key = CryptoJS.enc.Utf8.parse(key); //加密向量16位 iv = CryptoJS.enc.Utf8.parse(iv); let decrypted = CryptoJS.AES.decrypt(str, key, { iv: iv, padding: CryptoJS.pad.Pkcs7 }).toString(CryptoJS.enc.Utf8); return decrypted; }
前端需要引入类库,基于crypto-js(点击下载)
<!--加密解密类--> <script src="crypto-js/aes.js" type="text/javascript"></script>
前端使用
let str = "要加密的文本信息,如果是对象,请转换成文本"; let key = "52c7f81cd24c9699";//16位加密key let iv = "42e07d2f7199c35d";//16位偏移量 //加密成密文 let new_str = js_encrypt(str,key,iv); console.log(new_str); //解密成原文 let old_str = js_decrypt(new_str,key,iv); console.log(old_str);