Maison >interface Web >js tutoriel >Cryptage frontal Crypto.jsAES, décryptage PHP openssl_decrypt() pour une transmission sécurisée des données

Cryptage frontal Crypto.jsAES, décryptage PHP openssl_decrypt() pour une transmission sécurisée des données

灭绝师太
灭绝师太original
2021-08-31 11:04:164684parcourir

小 Pour le développement du programme WeChat Mini il y a quelques jours, s'il y a des données plus sensibles impliquées dans les projets qui sont séparées du front-end et du back-end, nous utilisons généralement le front-end et l'arrière pour le traitement du cryptage de l'interface. la bibliothèque crypto-js effectue le cryptage des données et le backend utilise PHP openssl_decrypt() pour décrypter et transmettre en toute sécurité les données~

          Advanced Encryption Standard (AES, Advanced Encryption Standard) est l'algorithme de cryptage symétrique le plus courant (la transmission cryptée par l'applet WeChat utilise ce algorithme de chiffrement). L'algorithme de chiffrement symétrique signifie que la même clé est utilisée pour le chiffrement et le déchiffrement. Le processus de chiffrement spécifique est le suivant :

                                                                                 .                                  crypto-js (GitHub) est une bibliothèque d'algorithmes de chiffrement purement JavaScript développée par Google, qui peut être très pratique en face end effectue les opérations de cryptage et de déchiffrement qu'il prend en charge. Actuellement, crypto-js prend en charge les algorithmes suivants : MD5, SHA-1, SHA-256, AES, Rabbit, MARC4, HMAC, HMAC-MD5, HMAC-SHA1, HMAC-SHA256, PBKDF2. Les méthodes de cryptage couramment utilisées incluent MD5 et AES.

Cryptage frontal Crypto.jsAES, décryptage PHP openssl_decrypt() pour une transmission sécurisée des données        

méthode d'installation de crypto-js

  npm install crypto-js
                                                                                                                                                                                à la stratégie de sécurité pour l'interface API de séparation front-end et back-end
1. Demandez au serveur d'obtenir un jeton aléatoire, create_time et stockez-le dans le cache de fichiers

2. Le front-end obtient le jeton, create_time utilise le cryptage CryptoJS pour générer une signature et la place dans l'en-tête de la requête

3. Service L'ingénieur final le déchiffre, termine la vérification de la rapidité de la signature et obtient les données d'interface

    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));
		}
	 })
    }

Enregistrez ensuite la fonction getAccessToken encapsulée sur le prototype vue

Ensuite, appelez simplement la méthode directement dans la méthode qui doit être utilisée comme indiqué dans l'image :

Cryptage frontal Crypto.jsAES, décryptage PHP openssl_decrypt() pour une transmission sécurisée des données

Le backend tp6 crée un intermédiaire. contrôleur Common.php, permettant à tous les contrôleurs sauf générateurs de tokens d'intégrer ce contrôleur intermédiaire et de détecter la validité de la signature en temps réel

common.php le code est le suivant : Cryptage frontal Crypto.jsAES, décryptage PHP openssl_decrypt() pour une transmission sécurisée des données

 <?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;
            }
             
        }
    	 
    	 
     
          
    }

ApiAuth.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;
            }
        }         
  
    }
}

Aes.php :

<?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;
    }
    
 }


Déployez et configurez les informations de configuration ici


【Apprentissage recommandé : Tutoriel avancé javascript

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn