怎样提升go中的RSA解密速度2~3倍

news2024/9/22 13:34:38

背景

我们的业务中大量的使用了RSA加密后的数据包,每个数据包大概17-30K不等,因为从php迁移到go,RSA解密业务是无法避免的,之前一直以为迁移后go的解密速度即使没有php快,但也应该相同因此使用了go中x509.ParsePKCS1PrivateKey和rsa.DecryptPKCS1v15实现解密业务。

测试过程

我们使用go版本是1.15.13,实现解密业务后,我们对程序进行解析压测时发现go实现解密比php要慢1倍,这个结果让我们很惊讶,经过review代码和重新验证设置的环境变量后发现确实要慢1倍。

排查

这样的结果是没办法接受的,因此尝试从1.15升级到1.19看看有没有什么变化,以下为开发mac测试结果,m1 16g
go1.15.13 解密花费时间:38-41ms
Go1.19.4 解密花费时间:20ms
从结果上看,1.19版本能提高2倍左右,于是果断升级到1.19后打包上线

上线效果

1.19的tag上线后,解密并没有任何变化,这让人匪夷所思从本地的测试的结果上看确实提升了2倍,于是把tag扔到了cpu为amd的测试机上,跑出来的效果是没升级版本前的效果,这时候有些慌了。

再次排查

于是重新开始梳理,仔细思考了下php为什么会比go快,突然想到php其实直接调用的是c,而在go中我们并没有直接使用cgo,也许就是这个原因吧。重新开始翻查rsa的包,发现1.19比1.15多了boring.go和notboring.go的文件,于是好奇进去看了看,有这么一句话引起了注意,翻译过来就是,如果使用boring必须设置CGO_ENABLED = 1,boringCrypto = 1
在这里插入图片描述
于是抱着试一试的心态去进行了环境变量设置,设置方法如下

CGO_ENABLED=1 GOEXPERIMENT=boringcrypto

重新打包后测试,性能提升符合预期,完美解决。

鸣谢

这里要感谢组内的同事,特别是一个97的同事。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/133743.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

公务员国考省考小白需知

文章目录: 一:分类 国考 省考 二:必备途径 1.相关网站 1.1 官网 1.2 机构 1.3 时事 1.4 资源 2.相关公主号 3.应用 三:相关需知 1.考试内容 2.老师选择 3.相关 4.公务员行政级别划分表 一:分类 国考…

嵌入式:ARM最小系统设计详解

文章目录一、什么是最小系统最小系统结构框图最小系统例板嵌入式最小系统硬件功能二、时钟和功率管理( 一 ) 时钟管理1、时钟电路结构2、锁相环 PLL( 二 ) 功率管理正常模式空闲模式低速模式掉电模式三、电源电路设计四、复位电路设计五、JTAG电路六、存储器扩展特性存储器映射…

程序员面试金典8.*

文章目录8.1三步问题8.2迷路的机器人8.3魔术索引8.4求幂集8.5递归乘法8.6 汉诺塔8.7无重复字符串的排列组合(☆)8.8有重复字符的排列组合8.9括号8.10颜色填充8.11硬币8.12八皇后8.1三步问题 一个基础的动态规划问题,pass dp[i]dp[i-1] dp[i-2] dp[i-3] dp[1]1, dp[…

linux系统中串口驱动的基本实现原理

大家好,今天主要和大家聊一聊,如何利用linux系统中的串口驱动。 目录 第一:linux系统中UART驱动框架 第二:uart_ops的具体实现 第三:串口驱动设备树的添加 第一:linux系统中UART驱动框架 向SPI一样&am…

ansible第二天作业

## 安装并且配置ansible 1)安装和配置ansible以及ansible控制节点server.example.com如下: 2)创建一个名为/home/student/ansible/inventory的静态库存文件如下所示: 2.1)node1 是dev主机组的成员 2.2)node2是test主机组的成员 2.3)node1和node2是prod主…

【JAVA】生产消费者问题

生产者/消费者问题是一个共享资源的问题,即生产者生产的产品不能超过最大存储量,而消费者消费的产品不能多于剩下的产品数量。 解决方法有很多种,这里通过同步线程锁: synchronized 但是仅仅使用线程锁是不足的,因为…

ElasticsSearch7.6.1学习笔记【狂神说Java】

文章目录一、ElasticSearch概述二、安装elasticsearch-7.6.1,基于windows 101、解压安装包以及目录结构介绍2、安装可视化插件elasticsearch-head3、解决跨域问题三、安装Kibana四、核心概念五、IK分词器插件1、什么是ik分词器2、解压3、进入kibana测试4、自定义扩展…

状态压缩DP——蒙德里安的梦想

状态压缩DP——蒙德里安的梦想一、题目描述二、思路分析1、状态表示——状态压缩2、状态转移3、循环4、初始化三、代码一、题目描述 二、思路分析 这道题中,其实刚一看是非常的抽象的,也是非常麻烦的。麻烦的点在于我们既需要考虑横着放的方块&#xff…

【Linux】shell命令以及运行原理和Linux权限的理解

🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🐌 个人主页:蜗牛牛啊 🔥 系列专栏:🚲Linux 📕 学习格言:博观而约取,厚积而薄发 …

VBA之正则表达式(39)-- 提取规格数据(2/2)

实例需求:A列为某产品名称,现需要提取其中的规格数据,具体规则如下: 规格数据以如下关键字开头:RO、RE、SQ、SD、QD、OB、HX、ET、QR、D2规则数据可能有多段(截图中红色部分)提取规格数据之后&…

SpringBoot简单功能分析,静态资源访问和静态资源配置原理解析

目录 1、SpringMVC自动配置概览 2、简单功能分析 2.1、静态资源访问 1、静态资源目录 2、静态资源访问前缀 3、webjar 2.2、欢迎页支持 2.3、自定义 Favicon 2.4、静态资源配置原理 1、SpringMVC自动配置概览 官网Web (spring.io) Spring Boot provides auto-configur…

论文综述——UNIRE: A Unified Label Space for Entity Relation Extraction

UNIRE: A Unified Label Space for Entity Relation Extraction1 任务介绍2 UniRE模型3 实验4 总结1 任务介绍 过构建标签空间来对实体和关系进行联合抽取的方法。 实体关系抽取旨在提取文本中的实体并检测它们的实体类型,以及对每个实体对检测它们的关系。作者提…

MAX78000FTHR简单介绍与初次上手

特点 MAX78000FTHR是基于MAX78000的小型板微控制器单元(MCU)。 该 MCU 面向在边缘运行的人工智能 (AI) 应用程序。在这种情况下,“边缘”并不意味着技术的前沿(尽管这就是芯片);这意味着靠近需要它的地方…

vector对于自定义类型的操作(memcpy浅拷贝问题)

目录 如果对于不涉及资源管理的自定义类型的操作(Date): 对涉及资源管理类操作(String): 一、插入四个元素(代码正常编译没有任何资源泄露问题) 二、当插入第五个元素时&#xf…

【C++进阶】Map 和 Set(详解)

🌈欢迎来到C专栏~~Map 和Set (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是Scort目前状态:大三非科班啃C中🌍博客主页:张小姐的猫~江湖背景快上车🚘,握好方向盘跟我有一起打天下嘞!送给自己的一句鸡汤&am…

【JavaScript】DOM 的概念、获取DOM元素和操作元素属性

文章目录【JavaScript】DOM 的概念、获取DOM元素和操作元素属性一. 概念二. DOM 操作(1) 获取DOM元素的方式1. document 获取元素方法2. 通过 HTML5 新增的方法获取案例:登录界面密码显示与隐藏(2) 读写元素内部的结构内容1. 改变元素节点里的内容2. 改变元素节点的…

操作系统的基本概念、功能、目标

文章目录🎀前言:本篇博客知识总览🪂操作系统所处位置📖操作系统的概念🎯操作系统的功能和目标🪅1.操作系统作为系统资源的管理者🪅2.操作系统作为用户与计算机硬件之间的接口🪅3.操作…

连接数据库和简单操作数据库

连接数据库和简单操作数据库JDBC程序编写步骤创建一个演员表数据库表的连接前置工作五种连接方式方式五的配置文件配置文件里面的内容通过JDBC进行对actor表操作。ideal执行后的结果数据库actor表结果JDBC程序编写步骤 1.注册驱动-加载Driver类 2.获取连接-得到Connection 3.执…

【阶段一】Python快速入门04篇:运算符、循环语句、条件语句与函数

本篇的思维导图: 运算符 算术运算符 算术运算就是常规的加、减、乘、除类运算。下表为基本的算术运算符及其示例。 描述 代码

【C++常用容器】STL基础语法学习map容器

目录 ●map基本概念 ●map构造和赋值 ●map大小和交换 ●map插入和删除 ●map查找和统计 ●map排序(map初始排序顺序为从小到大,用仿函数将其改为从大到小) ●map基本概念 map中的所有元素都是pair,pair中第一个元素为key&a…