日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

cbc cryptojs 前后端_前端CryptoJS AES/DES加解密与后端PHP AES/DES加解密

發布時間:2024/7/19 php 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cbc cryptojs 前后端_前端CryptoJS AES/DES加解密与后端PHP AES/DES加解密 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文涉及到的內容有:前端使用CryptoJS對數據進行DES或AES加密解密;

后端使用PHP openssl對數據進行解密和加密。

前端AES加密數據

首先在vue環境下安裝crypto-js,crypto-js項目地址:https://github.com/brix/crypto-js。npm?install?crypto-js?--save

在需要調用的組件中引入crypto-js:import?CryptoJS?from?'crypto-js'

我們在本站文章:《WEB開發中常見的加密方式有哪些》中了解到AES和DES屬于對稱加密,加密和解密使用同一個密鑰,那么在本文中我們就要前端和后端約定一個密鑰,我們在本文的例子中假定約定密鑰key=1234567890123456,AES-ECB模式加密,Pkcs7填充方式。//AES加密

encryptByAES(string,?key)?{

let?ckey?=?CryptoJS.enc.Utf8.parse(key);

let?encrypted?=?CryptoJS.AES.encrypt(string,?ckey,?{

mode:?CryptoJS.mode.ECB,

padding:?CryptoJS.pad.Pkcs7

});

//return?encrypted.toString();?//此方式返回base64格式密文

return?encrypted.ciphertext.toString();?//?返回hex格式的密文

}

現在我們要對數據admin進行AES加密:let?result?=?this.encryptByAES('admin',?key);

console.log(result);?//輸出7ae2d4a63d1c3e1a187a1fd89f471ef5

可以看到最后加密后得到的密文是16進制的字符串,初看結果有點像md5加密,是不是?

后端AES解密數據

前端加密后的數據,通過post或其他方式傳遞給后端PHP,PHP進行AES解密非常簡單,使用函數openssl_decrypt()即可解決。$mes?=?hex2bin($message);

$res?=?openssl_decrypt($mes,?'AES-128-ECB',?$key,?OPENSSL_RAW_DATA);

echo?$res;?//輸出admin

使用和前端一致的key,將密文進行hex2bin轉換,如果是base64格式的密文就不用這一步了,然后進行解密。不出意外的話最后輸出解密后的結果是:admin。

前端DES加密數據

同樣DES加密解密也需要約定一個相同的key,另外DES加密還需要約定一個iv(編譯量),DES-CBC模式加密,Pkcs7填充方式。encryptByDES(string,?key,?ivstr)?{

let?KeyHex?=?CryptoJS.enc.Utf8.parse(key);

let?encrypted?=?CryptoJS.DES.encrypt(string,

KeyHex,?{

mode:?CryptoJS.mode.CBC,??//?ecb模式不需要偏移量

padding:?CryptoJS.pad.Pkcs7,

iv:?CryptoJS.enc.Utf8.parse(ivstr)

});

//?let?hexstr?=?encrypted.toString();?//?此方式返回base64

let?hexstr?=?encrypted.ciphertext.toString()?//?返回hex格式的密文

return?hexstr;

}

本文例子中,我們約定密鑰key=1234567890123456,偏移量iv=123456。現在前端調用DES加密方法:let?result?=?this.encryptByDES('admin',?key,?iv);

console.log(result);?//輸出2ba086ec85d01afe

后端DES解密數據

PHP使用openssl_decrypt()對數據進行解密:$mes?=?hex2bin($message);

$res?=?openssl_decrypt($mes,?'DES-CBC',?$key,?OPENSSL_RAW_DATA,?$iv);

echo?$res;?//輸出admin

很顯然,先要對加密的數據進行hex2bin()轉換,然后直接解密,就是這樣簡單。對前端加密后的結果進行解密后得到結果是:admin。

后端AES/DES加密,前端解密

有時候也有反過來做的,后端返回給前端的數據是進行AES/DES加密過的,那么前端就需要對密文進行AES/DES解密了。這里將代碼直接亮出來,更多代碼請下載本文DEMO源碼查看。<?php

$key?=?'1234567890123456';?//密鑰,前后端雙方事先約定好

$iv?=?'12345678';?//偏移量,前后端雙方事先約定好,ecb模式不需要此參數

//AES加密

$aes?=?openssl_encrypt($message,?'AES-128-ECB',?$key,?OPENSSL_RAW_DATA);

$rs?=?bin2hex($aes);

//DES加密

$des?=?openssl_encrypt($message,?'DES-CBC',?$key,?OPENSSL_RAW_DATA,?$iv);

$rs?=?bin2hex($des);

前端對應的解密方法://AES解密

decryptByAES(string,?key)?{

let?ckey?=?CryptoJS.enc.Utf8.parse(key);

let?ciphertext?=?CryptoJS.enc.Hex.parse(string);

let?srcs?=?CryptoJS.enc.Base64.stringify(ciphertext);

let?decrypt?=?CryptoJS.AES.decrypt(srcs,?ckey,?{

mode:?CryptoJS.mode.ECB,

padding:?CryptoJS.pad.Pkcs7

});

let?decrypted?=?decrypt.toString(CryptoJS.enc.Utf8);

console.log(decrypted);

//return?decrypted.toString();

return?decrypted.toString(CryptoJS.enc.Utf8);

},

//DES解密

decryptByDES(ciphertext,?key,?ivstr)?{

let?keyHex?=?CryptoJS.enc.Utf8.parse(key);

let?decrypted?=?CryptoJS.DES.decrypt({

ciphertext:?CryptoJS.enc.Hex.parse(ciphertext)

},?keyHex,?{

iv:?CryptoJS.enc.Utf8.parse(ivstr),

mode:?CryptoJS.mode.CBC,

padding:?CryptoJS.pad.Pkcs7

});

return?decrypted.toString(CryptoJS.enc.Utf8);

}

對于AES和DES加密看起來簡單,但他們內部原理相當復雜,而且有很多種模式加密,這里就不深入探討了。無論是前端加密,還是解密,因為對稱加密涉及到密鑰,在前端加密中密鑰就會直接暴露出來,有心的人會很輕易拿到密鑰,那么前端加密就沒什么秘密了。所以筆者傾向于前端加密,后端再解密,再就是使用https協議部署web環境,真正的加密應用場景應該在接口對接驗證數據時使用。

總結

以上是生活随笔為你收集整理的cbc cryptojs 前后端_前端CryptoJS AES/DES加解密与后端PHP AES/DES加解密的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。