Rumah  >  Artikel  >  hujung hadapan web  >  Penyulitan Crypto.jsAES hadapan, penyahsulitan PHP openssl_decrypt() untuk penghantaran data selamat

Penyulitan Crypto.jsAES hadapan, penyahsulitan PHP openssl_decrypt() untuk penghantaran data selamat

灭绝师太
灭绝师太asal
2021-08-31 11:04:164617semak imbas

Beberapa hari yang lalu, saya sedang mengusahakan pembangunan applet WeChat Untuk projek yang memisahkan hujung hadapan dan belakang, jika banyak data sensitif terlibat, kami biasanya menggunakan hujung hadapan dan belakang untuk penyulitan antara muka Algoritma AES BASE64 untuk penyulitan, dan bahagian hadapan menggunakan JavaScript tulen Perpustakaan algoritma penyulitan crypto-js digunakan untuk penyulitan data, dan bahagian belakang menggunakan PHP openssl_decrypt() untuk menyahsulit data untuk penghantaran selamat~

Penyulitan Lanjutan. Standard (AES, Advanced Encryption Standard) ialah algoritma penyulitan simetri yang paling biasa (WeChat Program mini menyulitkan penghantaran menggunakan algoritma penyulitan ini). Algoritma penyulitan simetri bermakna kunci yang sama digunakan untuk penyulitan dan penyahsulitan Proses penyulitan khusus adalah seperti berikut:

                                    Penyahsulitan algoritma operasi perpustakaan menjadikannya sangat mudah untuk melaksanakan operasi penyulitan kelas algoritma penyulitan. hujung hadapan. Pada masa ini crypto-js menyokong algoritma berikut: MD5, SHA-1, SHA-256, AES, Arnab, MARC4, HMAC, HMAC-MD5, HMAC-SHA1, HMAC-SHA256, PBKDF2. Kaedah penyulitan yang biasa digunakan termasuk MD5 dan AES. Penyulitan Crypto.jsAES hadapan, penyahsulitan PHP openssl_decrypt() untuk penghantaran data selamat

kaedah pemasangan crypto-js


Selepas pemasangan berjaya, terus cari fail crypto-js.js dan perkenalkan const CryptoJS = require( './crypto-js.js');

  npm install crypto-js
dasar keselamatan antara muka api pemisahan bahagian hadapan dan belakang apl uniapp

1. Minta pelayan untuk mendapatkan token rawak, create_time dan simpannya dalam cache fail

2. Bahagian hadapan mendapat token, create_time menggunakan penyulitan CryptoJS untuk menjana tandatangan dan meletakkannya dalam pengepala permintaan

3. Jurutera pelayan menyahsulit itu, melengkapkan pengesahan ketepatan masa tanda dan memperoleh data antara muka

Kemudian daftarkan fungsi getAccessToken yang dikapsulkan ke prototaip vue

    const CryptoJS = require('./crypto-js.js'); //引用AES源码js
    const BASE_URL = "http://love.ouyangke.net/"
    const key = CryptoJS.enc.Utf8.parse("chloefuckityoall"); //十六位十六进制数作为密钥
    const iv = CryptoJS.enc.Utf8.parse('9311019310287172'); //十六位十六进制数作为非空的初始化向量
 
    export const getAccessToken = ()=> { 
	uni.request({
		url: BASE_URL + 'getAccessToken',
		method: 'GET',
		success:   (res) => {
			// console.log(res);
			const {
				data
			} = res 
			
			if (data.code == 0) {
				return
			}
			// console.log(data.token);
			var encrypted = CryptoJS.AES.encrypt(JSON.stringify({
				token: data.token,
				create_time: data.create_time
			}), key, {
				mode: CryptoJS.mode.CBC, 
				padding: CryptoJS.pad.Pkcs7,
				iv: iv
			}).toString()
			// console.log('签名完成',encrypted );
			// 记录在本地
			  uni.setStorage({
				key:"sign",
				data:encrypted
			});
	 
			 
			 

			
		},
		fail: (err) => {
			console.log(JSON.stringify(err));
		}
	 })
    }


Kemudian cuma panggil kaedah terus dalam kaedah yang anda perlu gunakan, Seperti yang ditunjukkan dalam gambar: Penyulitan Crypto.jsAES hadapan, penyahsulitan PHP openssl_decrypt() untuk penghantaran data selamat


Backend tp6 mencipta pengawal perantaraan Common.php, membenarkan semua pengawal kecuali menjana token untuk menyepadukan pengawal perantaraan ini dan mengesan tandatangan dalam masa nyata Kesahan Penyulitan Crypto.jsAES hadapan, penyahsulitan PHP openssl_decrypt() untuk penghantaran data selamat

kod common.php adalah seperti berikut:

ApiAuth.php

 <?php
    namespace app\love\controller;
    use app\BaseController;
    use think\facade\Cache;
    use lib\ApiAuth;
    class Common extends BaseController
    {
    
       
        const ILLEGAL_SIGN = &#39;sign is illegal&#39;;
        public function initialize()
        {
             
              $this->checkRequestAuth();    
        }
    
        //验证方法
         /**
    	 * 检验sign的真实性 
    	 * @return bool  校验通过返回true,失败返回false
    	 * 
         * 检查app每一次提交的数据是否合法
         */
        public function checkRequestAuth()
        { 
            //获取header头的某个信息sign
            $sign = request()->header(&#39;sign&#39;);
            
            $res = ApiAuth::checkSign($sign);
             
            if(!$res)
            {
                echo json_encode([&#39;status&#39;=>0,&#39;msg&#39;=>self::ILLEGAL_SIGN]);
                exit;
            }
             
        }
    	 
    	 
     
          
    }


Aes.php:

<?php
namespace lib;
use think\facade\Cache;
//校验类


class ApiAuth
{
    // 生成签名
    public static function setSign(Array $data=[])
    {
        ksort($data);
        $sign_str = http_build_query($data);
        return (new Aes())->encrypt($sign_str);
    }
    
    
    // 校验sign
    
    public static function checkSign($sign)
    {
      
    //   解密sign 获取到的明文信息 
        $str = (new Aes())->decrypt($sign);
         
        if(!$str)
        {
            return false;
        }
        
        $arr = json_decode($str,true);
    
        $res =  Cache::get($arr[&#39;token&#39;]);
           
        if(!is_array($arr) || count($arr)!=2 || !$res)
        {
             
            return false;
        }
        
        if($res)
        {
            if($arr[&#39;create_time&#39;] != $res)
            {
                
                return false;
            }else{
                //校验sign有效期 
                $cliff = time()-$arr[&#39;create_time&#39;];
                
                if ( $cliff > config(&#39;app.aes.api_sign_expire_time&#39;)) {
                  
                    return false;  
                }
                
                //验证通过,删除token
                Cache::delete($arr[&#39;token&#39;]);
                return true;
            }
        }         
  
    }
}


Sebarkan dan konfigurasikan maklumat konfigurasi di sini
<?php
namespace lib;
class Aes{
    private $key = null;
    private $iv = null;
    
    public function __construct(){
        $this->iv = config(&#39;app.aes.aesiv&#39;);//这里是从配置文件中取和前端一致的iv与key
        $this->key = config(&#39;app.aes.aeskey&#39;);
    }
    
    
    public function encrypt($plainText)
    {
        $data = openssl_encrypt($plainText, &#39;AES-128-CBC&#39;, $this->key, OPENSSL_RAW_DATA, $this->iv);
        $data = base64_encode($data);
        return $data;
    }
    
    public function decrypt($cipher)
    {
        $plainText = openssl_decrypt(base64_decode($cipher),&#39;AES-128-CBC&#39;,$this->key,OPENSSL_RAW_DATA,$this->iv);
     
        
        return $plainText;
    }
    
 }

[Pembelajaran yang disyorkan: Penyulitan Crypto.jsAES hadapan, penyahsulitan PHP openssl_decrypt() untuk penghantaran data selamattutorial lanjutan javascript

]

Atas ialah kandungan terperinci Penyulitan Crypto.jsAES hadapan, penyahsulitan PHP openssl_decrypt() untuk penghantaran data selamat. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn