php/js 互相加密/解密(使用 AES加密算法来进行举例)

本文中的php版本:PHP 7.4.28

前言

有时候,前端和后端(比如说 后端是PHP)进行数据交互的时候,为了安全性 前端需要把一些数据进行加密后 传输给后端,而后端拿到数据后 需要进行解密 才可以用。如果后端解密失败 则后端可以认为 前端或者客户端本次请求传输过来的数据 是恶意或者伪造的请求。后端就可以直接返回错误之类的提示 不进行下面的业务处理。


这种可以解密出来的数据 称之为 对称加密(咳咳 大概 可以这么粗略的认为)


本文中示例的代码 使用的加密算法为:AES加密算法

php加密-解密

php主要使用 openssl 扩展 提供的 openssl_encrypt()函数 及 openssl_decrypt()函数。

<?php

$data = 'abcQAQ7小周';       //要加密的数据
$key  = "1234567898882222";  //加密秘钥 这个key的字符位数要求:4的倍数
$iv   = '8NONwyJtHesysWpM';  //向量(偏移向量)

//加密
$encode = base64_encode(openssl_encrypt($data, "AES-128-CBC", $key, true, $iv));
echo $encode."\n";  //输出:Iesl622FoQue3FxVS85iJw==

//解密
$decode = openssl_decrypt(base64_decode($encode), "AES-128-CBC", $key, true, $iv);

echo $decode; //输出:abcQAQ7小周

注意:

①、openssl_encrypt()函数中的第二个参数 指的是 使用那种加密算法 可以使用 print_r(openssl_get_cipher_methods()); 代码来获取支持的加密算法。


②、openssl_encrypt()函数中的第二个参数 如果使用的是 DES-CBC 加密算法的话 则 第五个参数不用填写(即 iv参数无需填写)。

js加密-解密

js端 使用封装的 CryptoJS  加密算法库。

<script src="CryptoJS.min.js"></script>
<script>
    /*加密*/
    var pwd = CryptoJS.enc.Utf8.parse("abcQAQ7小周"); //加密的明文(要加密的数据)

    var key = CryptoJS.enc.Utf8.parse("1234567898882222"); //加密的 秘钥  这个key的字符位数要求:4的倍数(包含"")
    var iv  = CryptoJS.enc.Utf8.parse("8NONwyJtHesysWpM"); //偏移向量, CBC模式下用到, ECB模式不用

    var encode = CryptoJS.AES.encrypt(pwd, key, {
        mode: CryptoJS.mode.CBC,  // 加密模式
        padding: CryptoJS.pad.Pkcs7,  // 填充方式
        iv: iv  // 偏移向量
    }).toString();

    console.log(encode); //输出:Iesl622FoQue3FxVS85iJw==, base64的形式


    /*解密*/
    
    //必须为base64格式才能解密,如果为16进制 需要先转为base64
    
    var key = CryptoJS.enc.Utf8.parse("1234567898882222"); // 解析秘钥
    var iv  = CryptoJS.enc.Utf8.parse("8NONwyJtHesysWpM"); // 解析偏移向量, CBC模式下用到, ECB模式不用
    var decode = CryptoJS.AES.decrypt("Iesl622FoQue3FxVS85iJw==", key, {
        mode: CryptoJS.mode.CBC,  // 加密模式
        padding: CryptoJS.pad.Pkcs7,  // 填充方式
        iv: iv  // 偏移向量
    }).toString(CryptoJS.enc.Utf8);

    console.log(decode); //输出:abcQAQ7小周

</script>

注意:

①、CryptoJS.min.js文件 我会在文件底部提供下载链接。


②、CryptoJS  加密算法库 内置了很多种加密算法 这里只列举使用了AES加密算法,更多使用方式可以查询官方文档或者其它更多使用的相关资(姿)料(势)。


③、现在前端基本都是基于各种框架形式 很少直接写原生js代码了, 如果是使用 npm install 安装的这个加密库的话 则使用方式如下:

const CryptoJS = require('crypto-js')
 
const hash = CryptoJS.HmacSHA256(sign,  privatekey)
 
const SIGNATURE = CryptoJS.enc.Base64.stringify(hash)

尾声

①、CryptoJS.min.js文件直接下载地址:CryptoJS.min.zip


②、CryptoJS.min.js文件百度云分享地址:

链接:https://pan.baidu.com/s/1zyvYFgV4bDmwjqKQJHw4qA 

提取码:lnz0 



推荐博文:

PHP中的对称加密(AES加密方式)



声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

小周博客
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复 0人评论 7,777人参与

loading