解决的问题:
1.在云函数请求过程中入参参数暴露
2.云函数请求结束之后 出参结果暴露
解决方法:
1.在请求过程中对云函数的入参进行加密,在后端接收的时候将加密信息进行解密,根据自己的逻辑成功之后加密返回给前端 前端解密之后进行赋值。代码如下
A.使用crypto.js 定义两个方法encrypt加密方法和decrypt解密方法
代码如下:
const crypto = require('crypto');
const algorithm = 'aes-256-cbc';
const password = '你自己定义的密匙'; // 密钥
const key = Buffer.alloc(32, password, 'utf8'); // 生成32字节的密钥
const iv = crypto.randomBytes(16); // 生成16字节的初始化向量
//加密
export function encrypt(text) {
let cipher = crypto.createCipheriv(algorithm, key, iv);
let encrypted = cipher.update(text, 'utf8', 'hex');
encrypted += cipher.final('hex');
return {
iv: iv.toString('hex'),
encryptedData: encrypted
};
}
//解密
export function decrypt(encrypted) {
let iv = Buffer.from(encrypted.iv, 'hex', 'utf8');
let encryptedData = Buffer.from(encrypted.encryptedData, 'hex', 'utf8');
let decipher = crypto.createDecipheriv(algorithm, key, iv);
let decrypted = decipher.update(encryptedData, 'binary', 'utf8');
decrypted += decipher.final('utf8');
return decrypted;
}
B.新建一个request.js, 将请求方法进行封装
import {
encrypt,
decrypt
} from './jiami.js'
//是否加密字段
var isEncrypted = false
const req = (funName, params) => {
var row = {};
params.isEncrypted = isEncrypted
if (isEncrypted) {
row = {
code: encrypt(JSON.stringify(params))
}
} else {
row = params
}
console.log(row)
return new Promise((resolve) => {
uniCloud.callFunction({
name: funName,
data: row,
success: res => {
if (res.result.code == 200) {
res.result.info = JSON.parse(decrypt(res.result.info))
resolve(res.result)
} else {
resolve(res.result.code)
}
},
fail: () => {
resolve(false)
}
})
})
}
module.exports = {
req
}
C.使用前,记得在main.js里面引用
import reqFun from './common/request.js'
Vue.prototype.$reqFun = reqFun
D.使用上述定义的方法
将原始的
unicloud.callFunction替换成
this.$reqFun.req('你请求的云函数名称', '你的入参').then(res => {
//处理你的逻辑
})
E.云函数里面使用
//解密使用
const {
getVersion,
encrypt,
decrypt
} = require('encryption-and-decryption')
let arrayEvent = JSON.parse(decrypt(event.code))
arrayEvent这个就是解密之后的入参了,直接按照原来的event使用,自己的逻辑写完之后加密:
var result = encrypt(JSON.stringify(articleData))
//返回数据给客户端
return {
success: true,
code: 200,
message: '操作成功',
info: result
}
将数据返回给客户端。客户端获取到的res 就是解密之后的出参数据了
最最最重要的一点事加密方法在云函数里面还要在写一次(common目录 新建公共模块),
const crypto = require('crypto');
const algorithm = 'aes-256-cbc';
const password = '你的自定义密匙'; // 密钥
const key = Buffer.alloc(32, password, 'utf8'); // 生成32字节的密钥
const iv = crypto.randomBytes(16); // 生成16字节的初始化向量
//加密
function encrypt(text) {
let cipher = crypto.createCipheriv(algorithm, key, iv);
let encrypted = cipher.update(text, 'utf8', 'hex');
encrypted += cipher.final('hex');
return {
iv: iv.toString('hex'),
encryptedData: encrypted
};
}
//解密
function decrypt(encrypted) {
let iv = Buffer.from(encrypted.iv, 'hex', 'utf8');
let encryptedData = Buffer.from(encrypted.encryptedData, 'hex', 'utf8');
let decipher = crypto.createDecipheriv(algorithm, key, iv);
let decrypted = decipher.update(encryptedData, 'binary', 'utf8');
decrypted += decipher.final('utf8');
return decrypted;
}
module.exports = {
// 公用模块用法请参考 https://uniapp.dcloud.io/uniCloud/cf-common
encrypt,
decrypt
}
我自己就是这样做的,如果大佬还有更好的方法,请大佬不吝赐教。
我是大脸猫 一个自学前端毫无理论基础的代码渣渣= =