Rumah > Artikel > hujung hadapan web > Penyulitan Crypto.jsAES hadapan, penyahsulitan PHP openssl_decrypt() untuk penghantaran data selamat
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.
kaedah pemasangan crypto-js
Selepas pemasangan berjaya, terus cari fail crypto-js.js dan perkenalkan const CryptoJS = require( './crypto-js.js');
npm install crypto-jsdasar 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:
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
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 = 'sign is illegal'; public function initialize() { $this->checkRequestAuth(); } //验证方法 /** * 检验sign的真实性 * @return bool 校验通过返回true,失败返回false * * 检查app每一次提交的数据是否合法 */ public function checkRequestAuth() { //获取header头的某个信息sign $sign = request()->header('sign'); $res = ApiAuth::checkSign($sign); if(!$res) { echo json_encode(['status'=>0,'msg'=>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['token']); if(!is_array($arr) || count($arr)!=2 || !$res) { return false; } if($res) { if($arr['create_time'] != $res) { return false; }else{ //校验sign有效期 $cliff = time()-$arr['create_time']; if ( $cliff > config('app.aes.api_sign_expire_time')) { return false; } //验证通过,删除token Cache::delete($arr['token']); return true; } } } }
<?php namespace lib; class Aes{ private $key = null; private $iv = null; public function __construct(){ $this->iv = config('app.aes.aesiv');//这里是从配置文件中取和前端一致的iv与key $this->key = config('app.aes.aeskey'); } public function encrypt($plainText) { $data = openssl_encrypt($plainText, 'AES-128-CBC', $this->key, OPENSSL_RAW_DATA, $this->iv); $data = base64_encode($data); return $data; } public function decrypt($cipher) { $plainText = openssl_decrypt(base64_decode($cipher),'AES-128-CBC',$this->key,OPENSSL_RAW_DATA,$this->iv); return $plainText; } }
[Pembelajaran yang disyorkan: tutorial 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!