南京网站制作价格,上海大型网站建设公司,我的网站不做推广 百度能搜索到我网站吗,免费linux网站空间最近客户在做安全等保#xff0c;需要后台登录密码采用加密方式#xff0c;原来用个base64变形一下就算了#xff0c;现在不行#xff0c;一定要加密加key加盐~~ 前端使用Cypto-JS加密#xff0c;传输给后端使用PHP解密#xff0c;当然#xff0c;前端虽然有key有盐需要后台登录密码采用加密方式原来用个base64变形一下就算了现在不行一定要加密加key加盐~~ 前端使用Cypto-JS加密传输给后端使用PHP解密当然前端虽然有key有盐但这玩意儿用点心的话也不过是障眼法而已。 更新才发现今年初就已经写好模块用私钥公钥非对称RSA的方式来实现加密登录。。。我去老年痴呆越来越明显了 PHP开发日志 ━━ jsrsasign、jsencrypt、php实现前后端数据的RSA加密和解密
本文更侧重与前端使用纯js实现加密后端使用php解密前后端对称。
HTML(index.html)代码
!DOCTYPE html
html langen
headmeta charsetUTF-8script src./jquery.min.js/scriptscript src./crypto-js.min.js/script
/head
body
div stylemargin: 0;text-align:center;h2基于PHP和JS的AES相互加密解密方法详解(CryptoJS)/h2
/div
div stylemargin:0 18%;h4注意说明/h4ulli1. 首先引入CryptoJS包中的aes.js和pad-zeropadding.js/lili2. 其次引入了jquery.min.js和自己封装的function.js(内容主要是加密解密函数)/lili3. 加密解密过程中的向量和密钥必须保持一致/lili4. 进行加密的数据(字符串类型){username:1001,password:123456,terminal:PC}/lili5. 加密结果是变化的在这不写(变化的原因是因为密钥取得是当前时间)/lili6. 具体详情可读代码(注释完整)/li/ul
/divdiv stylemargin:0 18%;h4加密测试/h4ulli进行加密的数据(字符串类型){username:1001,password:123456,terminal:PC}/lili idencrypt_key/lili idencrypt_string/li/ul
/div
div stylemargin:0 18%;h4解密测试/h4ulli进行解密密的数据(字符串类型、PHP端生成)8bkd/doBOrG3pTEGkRwk9A3ZLrzXtf10E6Nn9CSoHXRXHydM7xt7PllPhUSItuK8ciF5g6UZ7DruCPQCVNZIJzI4ZHyUMJlV2aHyqMhbEoyS3pK6lPs1MsOeU/H7BZ5/lili iddecrypt_key解密的密钥(PHP端生成)/lili iddecrypt_stringJS解密后字符串/li/ul
/div
script//********************************加密**********************************//获取当前时间戳13位 3位字符var timestamp new Date().getTime().toString() WZH;//加密密钥16位var encrypt_key timestamp;//加密向量16位var iv ZZWBKJ_ZHIHUAWEI;//要加密的数据var encrypt_string {username:1001,password:123456,terminal:PC};//加密后密文加密函数在function.js文件中var encrypted_string encrypt(encrypt_string, encrypt_key, iv);$(#encrypt_key).text(JS加密密钥 encrypt_key);$(#encrypt_string).text(JS加密后字符串 encrypted_string);//********************************结束**********************************//********************************解密**********************************//解密密钥16位(解密向量同上)var decrypt_key 20180227110419WB;//解密密文字符串var decrypt_string 8bkd/doBOrG3pTEGkRwk9A3ZLrzXtf10E6Nn9CSoHXRXHydM7xt7PllPhUSItuK8ciF5g6UZ7DruCPQCVNZIJzI4ZHyUMJlV2aHyqMhbEoyS3pK6lPs1MsOeU/H7BZ5;var decrypted_string decrypt(decrypt_string, decrypt_key, iv);$(#decrypt_key).text(解密的密钥(PHP端生成) decrypt_key);$(#decrypt_string).text(JS解密后字符串 decrypted_string);//********************************结束**********************************
/script
/body
/html界面效果 JS(funciton.js)代码
/*** 接口数据加密函数* param str string 需加密的json字符串* param key string 加密key(16位)* param iv string 加密向量(16位)* return string 加密密文字符串*/
function encrypt(str, key, iv) {//密钥16位var key CryptoJS.enc.Utf8.parse(key);//加密向量16位var iv CryptoJS.enc.Utf8.parse(iv);var encrypted CryptoJS.AES.encrypt(str, key, {iv: iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.ZeroPadding});return encrypted;
}/*** 接口数据解密函数* param str string 已加密密文* param key string 加密key(16位)* param iv string 加密向量(16位)* returns {*|string} 解密之后的json字符串*/
function decrypt(str, key, iv) {//密钥16位var key CryptoJS.enc.Utf8.parse(key);//加密向量16位var iv CryptoJS.enc.Utf8.parse(iv);var decrypted CryptoJS.AES.decrypt(str, key, {iv: iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.ZeroPadding});return decrypted.toString(CryptoJS.enc.Utf8);
}PHP5或PHP8(index.php)代码
?php
header(Content-type:text/html;charsetutf-8);//加密向量16位
$iv ZZWBKJ_ZHIHUAWEI;
//********************************解密**********************************
//js加密秘钥16位
$decrypt_key 1519699179001WZH;
//js加密密文字符串
$decrypt_data ngX3VuJb2dBmfMEk4Q8eVGNnWeidwMZltHn78g4b8sn1i7Di8LPeNnQNQmY525LxADvJKIEpv2Vzs0w9fdlw;
$decrypted decrypt($decrypt_data, $decrypt_key, $iv);
//解密结果
var_dump($decrypted);
//exit;
//********************************结束**********************************
//********************************加密**********************************
//PHP加密秘钥16位
$encrypt_key date(YmdHis) . WB;
//PHP加密数据
$arr array(username 1001, password 123456, terminal PC);
//转换成json字符串
$encrypt_data json_encode($arr);
$encrypted encrypt($encrypt_data, $encrypt_key, $iv);
//加密结果
var_dump($encrypted);
exit;
//********************************结束**********************************//******************************集成函数********************************
/*** 加密字符串* param string $data 字符串* param string $key 加密key* param string $iv 加密向量* return string*/
function encrypt($data, $key, $iv)
{//支持php5//$encrypted mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);//支持php8//$decrypted openssl_encrypt($data, AES-128-CBC, $key,2, $iv);$encrypted openssl_encrypt($data, AES-128-CBC, $key, true, $iv);return base64_encode($encrypted);
}/*** 解密字符串* param string $data 字符串* param string $key 加密key* param string $iv 加密向量* return object*/
function decrypt($data, $key, $iv)
{//支持php5//$decrypted mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($data), MCRYPT_MODE_CBC, $iv);//支持php8//$decrypted openssl_decrypt($data, AES-128-CBC, $key,2, $iv);$decrypted openssl_decrypt(base64_decode($data), AES-128-CBC, $key, true, $iv);$json_str rtrim($decrypted, \0);return json_decode($json_str);
}其它
另一篇文章中的代码测试基本一致 var message 1_2_3_4_5_6_7_8_9_0;//utf8字符串待加密var iv CryptoJS.lib.WordArray.random(128 / 8).toString(CryptoJS.enc.Hex);//随机生成长度为32的16进制字符串。IV称为初始向量不同的IV加密后的字符串是不同的加密和解密需要相同的IV。var key 0321ebeba1f75de2d3cd3471af7418a4;//秘钥。长度32的16进制字符串。
var cryptkey CryptoJS.enc.Hex.parse(key);//将16进制字符串转换为 WordArray对象
//或者
//var key qwertyuiopasdfgh;//长度16的utf8字符串
//var cryptkey CryptoJS.enc.Utf8.parse(key);//将utf8字符串转换为 WordArray对象
//重点是 key要转换为WordArray对象加密时要用。//测试
var ciphertext aesEncrypt(message,cryptkey,iv);//加密
var decryptedMessage aesDecrypt(ciphertext,cryptkey,iv);//解密
console.log(decryptedMessage);//1_2_3_4_5_6_7_8_9_0
// jQuery(#a).val(ciphertext.toString());
// jQuery(#b).val(CryptoJS.enc.Hex.parse(iv).toString());
//** 加密 **
//var ciphertext CryptoJS.AES.encrypt(message, key, cfg);
//params: 注意参数key为WordArray对象
//return: 密码对象 或者 密码对象Base64字符串
function aesEncrypt(message,key,iv){var ciphertext CryptoJS.AES.encrypt(message, key, { iv: CryptoJS.enc.Hex.parse(iv),mode: CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7 });return ciphertext;//密码对象(Obejct类型非WordArray类型)Base64编码。//return ciphertext.toString();//密码对象的Base64字符串}//** 解密 **
//var plaintext CryptoJS.AES.decrypt(ciphertext, key, cfg);
//params: 注意参数ciphertext 必须为 Base64编码的对象或者字符串。
function aesDecrypt(ciphertext,key,iv){var decrypted CryptoJS.AES.decrypt(ciphertext,key,{ iv: CryptoJS.enc.Hex.parse(iv),mode: CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7 });return decrypted.toString(CryptoJS.enc.Utf8);//WordArray对象转utf8字符串
}文章来源
基于PHP和JS的AES相互加密解密方法详解(CryptoJS)基于PHP7和JS的AES相互加密解密方法详解2(CryptoJS)phpaes加密使用mcrypt_decrypt能解开openssl_decrypt却解不开whatCryptoJS中AES256(CBC)加密算法简单使用HTML使用 crypto-js-AES 加密