crypto模块的目的是为了提供通用的加密和哈希算法,包含对 OpenSSL 的哈希、HMAC、加密、解密、签名、以及验证功能的一整套封装。由于项目需求,我们这里讲crypto AES与MD5算法加密
首先我们需要引入Crypto,介绍俩种引入方式
<script src="https://cdn.bootcss.com/crypto-js/4.0.0/crypto-js.js"></script>
npm install crypto-js
import CryptoJS from 'crypto-js/crypto-js'
MD5
MD5是一种常用的哈希算法,用于给任意数据一个“签名”,下面举例展示了对数字1进行的MD5加密,并打印出加密后的密文。
function Md5 (string) {
return CryptoJS.MD5(string)
}
Md5(1).toString() // 487f7b22f68312d2c1bbc93b1aea445b
AES
高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥。
下面直接上AES加密解密代码:
import CryptoJS from 'crypto-js' // 引用crypto-js
const key = CryptoJS.enc.Utf8.parse('JtZ9RzYpN2tEVayl') // 十六位十六进制数作为密钥
const iv = CryptoJS.enc.Utf8.parse('JtZ9RzYpN2tEVayl') // 十六位十六进制数作为密钥偏移量
// 解密方法(Base64)
function Decrypt(word) {
let decrypt = CryptoJS.AES.decrypt(word, key, {
iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 })
let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8)
return decryptedStr.toString()
}
// 加密方法(Base64)
function Encrypt(word) {
// word为Json字符串
let srcs = CryptoJS.enc.Utf8.parse(word)
let encrypted = CryptoJS.AES.encrypt(srcs, key, {
iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 })
return CryptoJS.enc.Base64.stringify(encrypted.ciphertext)
}
function Md5 (string) {
return CryptoJS.MD5(string)
}
export {
Decrypt,
Encrypt,
Md5
}
上面的代码中的 key 是密钥 ,密钥为接收方与发送方协商产生,但不可以直接在网络上传输,否则会导致密钥泄漏,通常是通过非对称加密算法加密密钥,然后再通过网络传输给对方,或者直接面对面商量密钥。为了方便,这里我们直接在代码中定义;iv 是密钥偏移量。
在进行AES加密过程中,还需要注意一些配置
如果无法正确解密,要确认双方是否遵循同样的AES算法,字符串密钥和IV是否相同,加密后的数据是否统一为hex或base64格式。
根据项目需求,首先我们将数据进行MD5加密作为接口的签名,接着将数据和接口签名拼接上进行AES加密,然后将AES加密后的密文进行base64加密,生成最终的密文
在这里使用axios封装post请求
function post(url, params = {
}) {
return new Promise((resolve, reject) => {
params.sign = Md5(JSON.stringify(params)).toString() // md5加密 => 生成sign
const encryption = Encrypt(JSON.stringify(params)) // // AES加密
axios.post(url, {
json: encryption})
.then(res => {
resolve(JSON.parse(Decrypt(res.data)))
}, err => {
reject(err)
})
})
}
由于后台返回的数据也是密文,因此我们需要进行解密,获取到json格式的数据,在这里都已经封装好嘞。