当前位置: 首页 > 知识库问答 >
问题:

javascript - jsencrypts.js在微信小程序iOS下rsa解密慢的问题?

张通
2024-07-03

uniapp,vue3,vite框架

jsencrypts.js在微信小程序iOS下rsa解密,URLEncoder转码慢的问题.

加密内容是长内容,里面有中文字符,符号等,防止前端乱码,后端先转encodeurl编码,然后用再将内容rsa加密输出给前端.(rsa公 私钥用的512)

后端代码:

public static String encrypt(String content, String publicKey) {
    try {

        RSA rsa = new RSA(null, publicKey);

        content=URLEncoder.encode(content,"UTF-8");

        System.out.println("-------------------------------"+content);

        String ss = rsa.encryptBase64(content, KeyType.PublicKey);

        return ss;

    } catch (Exception e) {

        log.error("公钥加密异常 msg:{}",e.getMessage());

    }

    return null;
 

前端用jsencrypts.js解密,由于长内容,用的decryptLong方法,64字符分段解密, var MAX_DECRYPT_BLOCK = 64

前端再用decodeURIComponent转回中文字符,

分段解密时decryptLong会在方法里面去调decrypt方法,decrypt返回时间较慢。求问如何优化解码时间太长的问题

但是ios小程序解得很慢,约延迟8s+,定位下来,(h5,小程序安卓机速度都正常)

求问如何优化解码时间太长的问题

已尝试方法:换wxmp-rsa 解密,也是一样的效果,现如何解决ios解码慢的问题?

export function decrypt (s) {
// Return the decrypted string.
 try {

  var ret = "";

  var i;

  var k = 0; // b64 state, 0-3

  var slop = 0;

  for (i = 0; i < s.length; ++i) {

      if (s.charAt(i) == b64pad) {

          break;

      }

      var v = b64map.indexOf(s.charAt(i));

      if (v < 0) {

          continue;

      }

      if (k == 0) {

          ret += int2char(v >> 2);

          slop = v & 3;

          k = 1;

      }

      else if (k == 1) {

          ret += int2char((slop << 2) | (v >> 4));

          slop = v & 0xf;

          k = 2;

      }

      else if (k == 2) {

          ret += int2char(slop);

          ret += int2char(v >> 2);

          slop = v & 3;

          k = 3;

      }

      else {

          ret += int2char((slop << 2) | (v >> 4));

          ret += int2char(v & 0xf);

          k = 0;

      }

  }

  if (k == 1) {

      ret += int2char(slop << 2);

  }

  return this.getKey().decrypt(ret);
          }
      catch (ex) {

  return false;

  }

};

:换wxmp-rsa 解密,也是一样的效果,现如何解决ios解码慢的问题?希望大佬解答ios解密慢的问题

共有2个答案

蒋嘉实
2024-07-03

在worker里使用wasm可解
https://developers.weixin.qq.com/miniprogram/dev/framework/pe...
https://developers.weixin.qq.com/miniprogram/dev/api/worker/w...

张唯
2024-07-03

对于iOS上RSA解密速度慢的问题,可能有多个原因。由于您已经尝试了更换解密库但效果相同,我们可以从以下几个方面来探讨可能的解决方案:

  1. 硬件性能:iOS设备之间的硬件性能可能存在差异,尤其是旧款设备。解密操作通常是计算密集型的,因此可能会受到设备性能的限制。
  2. JavaScript引擎:微信小程序在iOS上使用的是WKWebView或WKSafariViewController,它们使用的JavaScript引擎可能与Android上的不同,这可能导致性能差异。
  3. 代码优化:虽然您已经使用了分段解密,但还可以检查decryptLongdecrypt方法的实现,看是否有可以优化的地方。
  4. RSA密钥长度:您提到使用的是512位的RSA密钥。虽然这比常见的1024位或2048位短,但在某些情况下,较短的密钥长度可能会导致更复杂的计算。考虑是否可以在保证安全性的前提下增加密钥长度。
  5. 减少加密数据量:如果可能的话,减少需要加密和解密的数据量。例如,只加密关键信息,而不是整个数据块。
  6. 使用原生模块:微信小程序支持使用原生模块来执行某些操作。您可以考虑编写一个原生模块来执行RSA解密操作,这可能会比JavaScript实现更快。
  7. 使用更快的算法:考虑使用更快的加密算法或库。但是,请注意,这可能会影响到安全性,因此需要谨慎权衡。
  8. 分析性能瓶颈:使用性能分析工具(如Chrome DevTools的Performance Tab)来分析解密操作中的性能瓶颈。这可以帮助您确定是哪个部分导致了延迟。
  9. 异步处理:如果解密操作不是立即需要的,可以考虑将其放在后台异步执行,以减少对用户界面的影响。
  10. 更新和修复:确保您使用的jsencrypts.js库或wxmp-rsa库是最新版本,并查看是否有任何已知的性能问题或修复。

针对您的情况,我建议您首先尝试减少加密数据量(如果可能)。然后,您可以考虑使用原生模块来执行解密操作。最后,如果问题仍然存在,您可以考虑使用性能分析工具来深入分析性能瓶颈,并据此进行优化。

 类似资料:
  • 我们有h5版的页面,为了快速实现小程序,我们用小程序的webview嵌套了h5,但是有些功能需要借助小程序的能力,文档上写的可以wx.miniProgram.postMessage. 但是需要引入微信的jssdk,还要有下面的配置 我们只是一个通用的h5页面,并没有公众号,没有appid这些东西,请问这种情况可以用jssdk吗?

  • 华为手机鸿蒙4.0,微信小程序获取定位获取不到,偶尔可以成功,ios没问题,失败的时候有时候只打印个start,有时候start也不打印

  • 场景: 我们是一个公司,然后给对面不同公司做对应的小程序, 但是数据不允许放在我们服务器里面,要放到他们服务器里面, 然后这样子的话就得请求他们的接口,用他们的域名, 然后我们的微信小程序就需要在后台配置不同公司的request合法域名, 但是我看微信小程序里面最多配置200个合法域名,而且到时候如果2000个,20000个呢, 这种情况该如何处理呢? 我想的是可以做一个代理转发,就放一个中间的请

  • 本文向大家介绍微信小程序开发之IOS和Android兼容的问题,包括了微信小程序开发之IOS和Android兼容的问题的使用技巧和注意事项,需要的朋友参考一下 微信小程序开发之IOS和Android兼容的问题 一、时间转换问题: 这不只是小程序上面的问题是ios系统 都有这个问题 就是new  Date("2017-06-16") 在IOS会出现NAN的情况所以对于时间转换需要另行封装,解决方案如

  • 本文向大家介绍微信小程序 devtool隐藏的秘密,包括了微信小程序 devtool隐藏的秘密的使用技巧和注意事项,需要的朋友参考一下 微信小程序 devtool 笔者参与的小程序项目开发也进入尾声了,坑也踩得七七八八,对于哪些没有涵盖和深入使用的功能笔者就不班门弄斧了。 前几篇文章讲了那么多细节也好,策略也好,都是应用层面的东西。自微信小程序公布以来就有先行者不断的探索小程序背后的运行机制。小程

  • @megalo/target 的 platform 设置成 wechat,mini-css-extract-plugin 提取文件后缀改成微信小程序的 wxss。 const createMegaloTarget = require( '@megalo/target' ) const compiler = require( '@megalo/template-compiler' ) const M