后端私钥加密,前端使用wxapp_rsa.js用公钥解密

本文详细介绍了如何实现后端使用私钥加密,前端利用公钥解密的过程,以及遇到的长数据解密报错和中文乱码问题的解决方案。通过改造wxapp_rsa.js插件,分段加解密方法以及处理字节分割导致的乱码,最终成功完成了安全的数据传输。
摘要由CSDN通过智能技术生成

最近开发了一个需求,后端用私钥对返回的数据进行加密,前端用对应的公钥进行解密。为什么会这样呢?因为后端返回的数据有手机号、身份证号等明文数据,公司出于安全考虑,所以要对这样的接口进行安全改造。
因为之前,前端在项目中有使用wxapp_rsa.js进行公钥加密,后端私钥解密这样的功能,所以我就尝试用wxapp_rsa.js去解密,但是如果前端私钥解密的话,就会存在私钥泄露的情况,所以最后就定义为后端私钥加密,前端公钥解密。
真正去开发需求的时候还是遇到了很多问题,下面我会一一道来。

一、前后端确定加密的方式,后端加密,前端解密

出于安全考虑,后端私钥加密,前端公钥解密(虽然这不符合常规,一般都是公钥加密,私钥解密或者验签的时候,私钥加密,公钥验签)

二、前端公钥解密,wxapp_rsa.js有私钥解密的方法,没有公钥解密的方法,需要对wxapp_rsa.js这个插件进行改造。

改造如下:
1、修改RSADecrypt函数

function RSADecrypt(b) {
   
    var d = parseBigInt(b, 16);
    // 这里doPrivate修改为doPublic
    // var m = this.doPrivate(d);
    var a = this.doPublic(d);
    if (a == null) {
   
        return null
    }
    return pkcs1unpad2(a, (this.n.bitLength() + 7) >> 3)
}

2、修改pkcs1unpad2函数

function pkcs1unpad2(g, j) {
   
    var a = g.toByteArray();
    var f = 0;
    while (f < a.length && a[f] == 0) {
   ++f
    }
    // // 这里将如下三行代码注释
    // if (a.length - f != j - 1 || a[f] != 2) {
   
    //     return null
    // }
    ++f;
    while (a[f] != 0) {
   
        if (++f >= a.length) {
   
            return null
        }
    }
    var e = "";
    while (++f < a.length) {
   
        var h = a[f] & 255;
        if (h < 128) {
   
            e += String.fromCharCode(h)
        } else {
   
            
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值