小程序实现RSA加密解密
由于小程序端无法调用node的原生模块,导致node-rsa无法使用,但是小程序云函数端是nodejs搭建的,所以通过将rsa加密解密算法写入云函数然后小程序端调用。
rsa主要使用的是非对称加密,非对称加密的关键在于 有 公钥 / 私钥
用法:
a.生成一对公钥私钥
b.公钥加密 -> 对应私钥解密
c.私钥加密 -> 对应公钥解密
非对称加密的常见应用方式
a.公钥加密,发给私钥拥有者,私钥解密获得明文。其它人用公钥解不开
b.私钥加密(签名)
公钥的传输(混合加密)
a.使用对称加密算法发布公钥
b.使用对称加密算法解密公钥,再使用公钥加密明文,发给私钥拥有者
云函数端
// 云函数入口文件
const cloud = require('wx-server-sdk')
const NodeRSA = require('node-rsa');
cloud.init()
// 云函数入口函数
exports.main = async (event, context) => {
// key:公钥 en:true加密 false解密
let publicKey = event.key
let en = event.en
let result
const payload = event.payload
if(en){
result = encrypt(payload,publicKey);
}else{
result = decrypt(payload,publicKey);
}
return result
}
// 公钥加密
function encrypt(payload,publicKey) {
const key = new NodeRSA();
let start = '-----BEGIN PUBLIC KEY-----'
let end = '-----END PUBLIC KEY-----'
const keyData = start+publicKey+end
key.importKey(keyData,'pkcs8-public')
const data = key.encrypt(JSON.stringify(payload),'base64', "utf8")
return data
}
// 公钥解密
function decrypt(payload,publicKey) {
const key = new NodeRSA();
let start = '-----BEGIN PUBLIC KEY-----'
let end = '-----END PUBLIC KEY-----'
const keyData = start+publicKey+end
key.importKey(keyData,'pkcs8-public')
const data = key.decryptPublic(payload, "utf8")
return data
}
小程序端
//加密
wx.cloud.callFunction({
name: 'RSA',
data: {
key:getkey.loginAuthKey,
en:true,
//payload:json格式
payload:payload
},
success(_res) {
console.log(_res)
},
fail(_res) {
console.log(_res)
}
})
//解密
wx.cloud.callFunction({
name: 'RSA',
data: {
key:getkey.loginAuthKey,
en:false,
//加密后的字符串
payload:payload
},
success(_res) {
console.log(_res)
},
fail(_res) {
console.log(_res)
}
})