js结合AES RSA进行加密

想要了解两种加密算法查询其他资料,这里仅介绍加密流程及js代码

流程:
  1. 随机生成一个字符串(本文用32个字节的16进制字符),记为ramdomStr
  2. 请求从后端获取一个公钥,此公钥用于RSA加密,记为publicRsaKey
  3. 用RSA加密算法对ramdomStr用publicRsaKey进行加密,得到新的key记为newKey
  4. 对ramdomStr进行AES(对称加密)加密,得到key记为cryptkey
  5. 用cryptkey对数据进行加密得到加密后的数据encryptedData
  6. 最后把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)
  })
}

用法:执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值