BoringBlue
文章15
标签18
分类7
Vue+PHP Aes加密

Vue+PHP Aes加密

这里用的AES的ECB模式,示例使用场景,登录

Vue(这里是定义的全局方法):

step1:安装

npm install crypto-js –save-dev

step2:创建加密/解密方法

在main.js中引入,创建全局加密、解密方法

//引入

    import CryptoJS from 'crypto-js';

//创建方法

    //AES加密
    Vue.prototype.$encrypt = function(word, keyStr) {

    keyStr = keyStr ? keyStr : 'test123456789012'; //判断是否存在ksy,不存在就用定义好的key

    var key = CryptoJS.enc.Utf8.parse(keyStr);

    var srcs = CryptoJS.enc.Utf8.parse(word);

    var encrypted = CryptoJS.AES.encrypt(srcs, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });

    return encrypted.toString();

    }

    //AES解密
    Vue.prototype.$decrypt = function(word, keyStr) {

    keyStr = keyStr ? keyStr : 'test123456789012';

    var key = CryptoJS.enc.Utf8.parse(keyStr);

    var decrypt = CryptoJS.AES.decrypt(word, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });

    return CryptoJS.enc.Utf8.stringify(decrypt).toString();

    }

step3:使用

      var password = this.$encrypt(this.password)//密码加密传输
      doLogin({ username: this.username, password: password }).then(
        res => {
          if (res.data.code == 200) {
            var res_json_str = this.$decrypt(res.data.data)//解密
            var res_data = JSON.parse(res_json_str)
            console.log("返回:"+res_data );
            successAlert("登录成功");
          } else {
            errorAlert(res.data.msg);
          }
        }
      );

PHP:

step1:创建AES加密类

注:我这里用的是ECB模式,另外,key和iv长度为16

    <?php
    namespace app\common;

    //也可以直接用define定义常量
    //define('KEY','test123456789012');
    //define('IV','test123456789012');

    /**
    * Aes  对称加密
    */
    class Aes {

        const KEY = 'test123456789012';
        const IV = 'test123456789012';

        /**
        * 加密   ECB - 128 - addPkcs7Padding
        */
        public function encrypts($data)
        {
            // $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, self::KEY, $this->addPkcs7Padding($data), MCRYPT_MODE_ECB,self::IV);//php7.1以下版本用法
            return base64_encode(openssl_encrypt($data,"AES-128-ECB",self::KEY,OPENSSL_RAW_DATA));//php7.1以上版本用法

        }

        /**
        * 解密
        */
        public function decrypts($data)
        {
            // $data =base64_decode($data);
            // return $this->stripPkcs7Padding(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, self::KEY, $data, MCRYPT_MODE_ECB, self::IV));//php7.1以下版本用法
            return openssl_decrypt(base64_decode($data),"AES-128-ECB",self::KEY,OPENSSL_RAW_DATA);//php7.1以上版本用法

        }


        public function addPkcs7Padding($string, $blocksize = 16) 
        {
            $len = strlen($string); //取得字符串长度
            $pad = $blocksize - ($len % $blocksize); //取得补码的长度
            $string .= str_repeat(chr($pad), $pad); //用ASCII码为补码长度的字符, 补足最后一段
            return $string;
        }


        public function stripPkcs7Padding($string){
            $slast = ord(substr($string, -1));
            $slastc = chr($slast);
            $pcheck = substr($string, -$slast);

            if(preg_match("/$slastc{".$slast."}/", $string)){
                $string = substr($string, 0, strlen($string)-$slast);
                return $string;
            } else {
                return false;
            }
        }
    }

step2:使用

我是用的Yii框架(但基本用法都差不多)

    use app\common\Aes;

    //......

        $aes = new Aes();
        $res = $aes->encrypts($data);//加密
        //$res = $aes->decrypts($data);//解密

tips:关于登录时密码为什么加密?使用加密后,浏览器控制台的payload里就看不到密码啦
payload里都是明文记录,除非记录的是加密数据,否则不排除泄露隐私数据的可能。所以不推荐在payload中记录任何敏感数据哈

最后

此内容是从我的开源中国博客菜鸟要飞啊里copy过来的
Vue + PHP AES数据传输加密,payload加密
PHP AES加密

×