关于unicloud 云函数开发 加密的问题

解决的问题:

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
}

我自己就是这样做的,如果大佬还有更好的方法,请大佬不吝赐教。

                                我是大脸猫  一个自学前端毫无理论基础的代码渣渣= =

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值