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加解密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 正态分布图_用EXCEL简易制作正态分布
- 下一篇: 日志 php_高性能的PHP日志系统 S