想要了解两种加密算法查询其他资料,这里仅介绍加密流程及js代码
流程:
- 随机生成一个字符串(本文用32个字节的16进制字符),记为ramdomStr
- 请求从后端获取一个公钥,此公钥用于RSA加密,记为publicRsaKey
- 用RSA加密算法对ramdomStr用publicRsaKey进行加密,得到新的key记为newKey
- 对ramdomStr进行AES(对称加密)加密,得到key记为cryptkey
- 用cryptkey对数据进行加密得到加密后的数据encryptedData
- 最后把encryptedData和newKey以商量好的格式传给后端,后端拿到这个字符串对newKey进行解密,拿到原始ramdomStr,再对数据encryptedData进行解密,拿到原始数据
例:encryptData= ‘haha’, newKey=‘hehe’, 和后端商量好以##号进行连接。变成haha##hehe,后端以##进行分割,后端用RSA的私钥对hehe进行解密得到原始ramdomStr,用ramdomStr对haha进行数据解密,得到原始数据
附流程图,附加防篡改流程
npm i crypto-js -S //AES加密算法
npm i jsencrypt -S //RSA加密算法
npm i axios -S //RSA加密算法
// 正文开始
import CryptoJS from 'crypto-js'
import 'jsencrypt'
export function generandomhexstr (length){
let text = ''
let possible = '0123456789abcdef'
for( let i=0; i < length; i++ ){
text += possible.charAt(Math. floor(Math. random() * possible.length))
}
return text
} //获取随机字符串
/* [用法: 执行encryption函数]
* @param {String} getPubkeyUrl [请求公钥的接口]
* @param {Object/String} data [要加密的数据]
* @param {function} fn [拿到加密格式的回调函数]
*/
export function encryption (getPubkeyUrl, data, fn) {
axios.get(getPubkeyUrl, {prodName: 'pdm'}).then(res => { //flyio与axios同样功能,都是用于请求的,返回promise
if (!res.data) return //res.data 为请求到的公钥
let key= generandomhexstr(32) //得到ramdomStr
/* AES加密 */
let cryptkey = CryptoJS.enc.Hex.parse(key) //得到cryptkey
if (typeof data === 'object'){
data = JSON.stringify(data)
}
let encryptedData = CryptoJS.AES.encrypt(data, cryptkey, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
})
let encrypted = encryptedData.ciphertext.toString() //对数据进行加密得到encryptedData
/* rsa加密 */
let upperKey = key.toUpperCase()
let encrypt = new window.JSEncrypt()
encrypt.setPublicKey(res.data)
let newKey = encrypt.encrypt(upperKey) //newKey
typeof fn == 'function' && fn(`${newKey}##${encrypted}`) //与后端商定用##号进行分割
}). catch(err => {
console. log(err)
})
}
用法:执行