在前后端通信中,安全性是一个重要的考虑因素。前端代码是公开的,用户可以通过调试工具查看甚至修改代码,因此无法保证绝对的安全性。开发者能做的仅仅是增加攻击者的破解成本。
安全隐患
安全建议
AES(Advanced Encryption Standard)是一种对称加密算法,广泛用于数据加密和保护。它有两个重要参数:key
和 iv
。
参数说明
PHP 加密,JavaScript 解密
PHP 实现 AES-256-CBC 加密
function aesEncrypt($str, $key, $iv) {
return base64_encode(openssl_encrypt($str, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv));
}
$str = '{"code":0,"msg":"success","data":{"lists":{"k1":"v1","k2":"v2"}}}';
$key = 'abcdabcdabcdabcdabcdabcdabcdabcd'; // 32字节密钥
$iv = 'abcdabcdabcdabcd'; // 16字节IV
echo aesEncrypt($str, $key, $iv);
JavaScript 实现 AES-256-CBC 解密
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>
<script>
function decrypt(str, key, iv) {
return CryptoJS.AES.decrypt(str, CryptoJS.enc.Utf8.parse(key), {
iv: CryptoJS.enc.Utf8.parse(iv),
padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8);
}
console.log(decrypt('naQ3ZnyGetarkvugVeNaroUe9Hrk+KW3sKXSs42QJ6tPER1zcxvS8E2xsCJG0UaJ5WMFhFgLjD6z3wbqPLFgRFIl+BaGqINmdPbm9B+DXMs=',
'abcdabcdabcdabcdabcdabcdabcdabcd',
'abcdabcdabcdabcd'));
</script>
JavaScript 加密,PHP 解密
JavaScript 实现 AES-256-CBC 加密
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>
<script>
function encrypt(str, key, iv) {
return CryptoJS.AES.encrypt(str, CryptoJS.enc.Utf8.parse(key), {
iv: CryptoJS.enc.Utf8.parse(iv),
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}).toString();
}
console.log(encrypt('{"name":"张三", "age": 20}', 'abcdabcdabcdabcdabcdabcdabcdabcd', 'abcdabcdabcdabcd'));
</script>
PHP 实现 AES-256-CBC 解密
function aesDecrypt($str, $key, $iv) {
return openssl_decrypt(base64_decode($str), 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
}
$str = 'aZlC1imJbcUQblRR0QsMPGF+8Kbja/1fU+tdcTyAUVw=';
$key = 'abcdabcdabcdabcdabcdabcdabcdabcd'; // 32字节密钥
$iv = 'abcdabcdabcdabcd'; // 16字节IV
echo aesDecrypt($str, $key, $iv);
RSA 是一种非对称加密算法,适合小数据量的加密场景。由于其计算复杂度较高,不适用于大文件或大数据量的加密。
RSA 的局限性
PHP 公钥加密,JavaScript 私钥解密
PHP 实现 RSA 加密
function encryptRsa($str, $pub_key) {
$encrypt_str = '';
if (!openssl_public_encrypt($str, $encrypt_str, $pub_key)) {
return '';
}
return base64_encode($encrypt_str);
}
echo encryptRsa(
json_encode(['code' => 0, 'msg' => 'success', 'data' => ['lists' => [1, 2, 3]]]),
file_get_contents('public.key')
);
JavaScript 实现 RSA 解密
<script src="https://cdnjs.cloudflare.com/ajax/libs/jsencrypt/3.3.2/jsencrypt.min.js"></script>
<script>
function decryptRsa(str, private_key) {
var encrypt = new JSEncrypt();
encrypt.setPrivateKey(private_key);
return encrypt.decrypt(str);
}
console.log(decryptRsa('接口返回的base64编码过的字符串', '私钥字符串'));
</script>
JavaScript 公钥加密,PHP 私钥解密
JavaScript 实现 RSA 加密
<script src="https://cdnjs.cloudflare.com/ajax/libs/jsencrypt/3.3.2/jsencrypt.min.js"></script>
<script>
function encryptRsa(data, public_key) {
var encrypt = new JSEncrypt();
encrypt.setPublicKey(public_key);
return encrypt.encrypt(data);
}
console.log(encryptRsa('要加密的字符串', '公钥字符串'));
</script>
PHP 实现 RSA 解密
function decryptRsa($str, $private_key) {
openssl_private_decrypt(base64_decode($str), $res, $private_key);
return $res;
}
echo decryptRsa(
'被解密的base64字符串',
file_get_contents('private.key')
);
为了防止数据在传输过程中被篡改,可以使用签名机制。
签名流程
示例代码
$hacker_data = 'b.af997aac21a6eeaa354fa4d46eed2c58';
list($init_data, $sign) = explode('.', $hacker_data);
// 验签
if (md5($init_data . '自定义的盐') !== $sign) {
return '验签不通过,拦截掉本次请求';
}
本文被 PHP编程 专题收录