当前位置: 首页 > article >正文

Spring Boot项目实战:手把手教你用BouncyCastle集成国密SM2(含完整工具类)

Spring Boot项目实战BouncyCastle集成国密SM2全流程指南在金融、政务等对数据安全要求极高的领域国密算法正逐步成为技术选型的首选方案。作为国产密码体系的核心组件SM2算法凭借其基于椭圆曲线的非对称加密特性正在替代RSA成为新一代安全通信的基石。本文将带您从零开始在Spring Boot项目中实现SM2算法的完整集成涵盖密钥管理、加解密、签名验签等核心功能最终形成可直接复用的生产级解决方案。1. 环境准备与依赖配置1.1 基础环境要求确保开发环境满足以下条件JDK 1.8或更高版本推荐JDK 11Spring Boot 2.5.x及以上Maven 3.6或Gradle 7.x关键依赖配置dependency groupIdorg.bouncycastle/groupId artifactIdbcprov-jdk15on/artifactId version1.70/version /dependency注意BouncyCastle版本需与JDK版本匹配JDK 17建议使用bcprov-jdk18on1.2 安全提供者注册在应用启动时自动注册BouncyCastle安全提供者SpringBootApplication public class SecurityApplication { static { Security.addProvider(new BouncyCastleProvider()); } public static void main(String[] args) { SpringApplication.run(SecurityApplication.class, args); } }2. 密钥管理体系设计2.1 密钥生成策略SM2密钥对生成的最佳实践public class SM2KeyGenerator { private static final String ALGORITHM EC; private static final String CURVE_NAME sm2p256v1; public static KeyPair generateKeyPair() throws Exception { KeyPairGenerator generator KeyPairGenerator.getInstance( ALGORITHM, new BouncyCastleProvider() ); generator.initialize(new ECGenParameterSpec(CURVE_NAME)); return generator.generateKeyPair(); } }2.2 密钥存储方案推荐三种密钥存储方式对比存储方式安全性易用性适用场景配置文件中高开发环境数据库高中生产环境KMS服务最高低金融级应用数据库存储示例Entity public class KeyPairEntity { Id private String keyId; Lob private String publicKey; Lob private String privateKey; Enumerated(EnumType.STRING) private KeyStatus status; }3. 核心加密功能实现3.1 数据加密解密SM2加密工具类实现public class SM2Encryptor { private static final SecureRandom SECURE_RANDOM new SecureRandom(); public static byte[] encrypt(byte[] data, PublicKey publicKey) { SM2Engine engine new SM2Engine(); ECPublicKeyParameters ecPublicKey convertPublicKey(publicKey); engine.init(true, new ParametersWithRandom(ecPublicKey, SECURE_RANDOM)); try { return engine.processBlock(data, 0, data.length); } catch (InvalidCipherTextException e) { throw new CryptoException(SM2加密失败, e); } } private static ECPublicKeyParameters convertPublicKey(PublicKey publicKey) { // 密钥转换实现... } }3.2 签名与验签完整签名流程示例public class SM2Signer { public static byte[] sign(byte[] data, PrivateKey privateKey) { try { Signature signature Signature.getInstance( SM3withSM2, new BouncyCastleProvider() ); signature.initSign(privateKey); signature.update(data); return signature.sign(); } catch (Exception e) { throw new CryptoException(签名生成失败, e); } } public static boolean verify(byte[] data, byte[] signature, PublicKey publicKey) { // 验签实现... } }4. Spring Boot集成实践4.1 自动配置方案创建自定义Starter实现自动配置Configuration ConditionalOnClass(SM2Operations.class) public class SM2AutoConfiguration { Bean ConditionalOnMissingBean public SM2Operations sm2Operations() { return new DefaultSM2Operations(); } Bean public SM2KeyManager sm2KeyManager( Value(${sm2.key-store:file}) String keyStoreType) { return KeyStoreFactory.create(keyStoreType); } }4.2 REST API安全增强控制器层安全示例RestController RequestMapping(/api/secured) public class SecureController { Autowired private SM2Operations sm2; PostMapping(/transfer) public ResponseEntity? secureTransfer( RequestBody Encrypted Payload payload, RequestHeader(X-Signature) String signature) { if (!sm2.verify(payload.rawData(), signature)) { throw new SecurityException(签名验证失败); } // 业务处理逻辑 return ResponseEntity.ok().build(); } }5. 性能优化与生产建议5.1 缓存策略密钥缓存实现方案Cacheable(value sm2Keys, key #keyId) public KeyPair getKeyPair(String keyId) { return keyRepository.findById(keyId) .map(this::convertToKeyPair) .orElseThrow(() - new KeyNotFoundException(keyId)); }5.2 异常处理规范统一异常处理建议ControllerAdvice public class CryptoExceptionHandler { ExceptionHandler(CryptoException.class) public ResponseEntityErrorResponse handleCryptoError( CryptoException ex) { ErrorResponse response new ErrorResponse( CRYPTO_ERROR, ex.getMessage() ); return ResponseEntity .status(HttpStatus.BAD_REQUEST) .body(response); } }6. 测试验证方案6.1 单元测试规范使用Testcontainers进行集成测试SpringBootTest Testcontainers class SM2IntegrationTest { Container static GenericContainer? kmsContainer new GenericContainer(kms:latest) .withExposedPorts(8080); Test void testEndToEndEncryption() { // 测试用例实现 } }6.2 性能基准测试JMH基准测试示例BenchmarkMode(Mode.Throughput) OutputTimeUnit(TimeUnit.SECONDS) public class SM2Benchmark { Benchmark public void measureEncryption(Blackhole bh) { byte[] encrypted SM2Encryptor.encrypt(testData, publicKey); bh.consume(encrypted); } }

相关文章:

Spring Boot项目实战:手把手教你用BouncyCastle集成国密SM2(含完整工具类)

Spring Boot项目实战:BouncyCastle集成国密SM2全流程指南 在金融、政务等对数据安全要求极高的领域,国密算法正逐步成为技术选型的首选方案。作为国产密码体系的核心组件,SM2算法凭借其基于椭圆曲线的非对称加密特性,正在替代RSA成…...

安川弧焊机器人焊接节气装置选型指南:实现节气40%-60%的节气效果

安川弧焊机器人凭借精准的运动控制与稳定的焊接性能,在电子制造、汽车零部件加工、精密焊接等领域应用广泛,其弧焊作业的核心需求的是兼顾焊缝质量与生产成本。保护气体作为弧焊作业的关键耗材,供给合理性直接影响焊缝成形与企业效益&#xf…...

并发与并行编程模型演进:从锁到Actor到协程——测试视角下的缺陷模式与质量保障

当并发成为常态,测试便不再只是“跑通”在单核时代,测试并发代码往往只需关注逻辑上的交错执行;而如今,多核CPU与分布式系统已成标配,并发与并行无处不在。对于软件测试从业者而言,这并非仅仅意味着需要执行…...

XMIND 安装包破解版(苹果电脑 WINDOWS电脑 手机)

XMIND 安装包破解版(苹果电脑 WINDOWS电脑 手机) 通过网盘分享的文件: 链接: https://pan.baidu.com/s/1ukaCaM08Lafpn_MAGySKZg?pwdd6cw 复制这段内容后打开百度网盘手机App,操作更方便哦...

从富士通-松下SoC合并案看技术整合的协同效应陷阱与战略避坑

1. 从一则旧闻谈起:当“负一加负一等于负三”2013年初,一则关于日本科技巨头富士通与松下可能合并其系统级芯片业务的传闻,在业界激起了不小的涟漪。当时,EE Times的资深记者在东京采访了半导体行业的观察家与批评者,得…...

CPT外汇:多元化产品体系的综合呈现

金融服务行业的复杂性决定了平台需要在多个维度上同时具备较高的水准。CPT外汇经过多年的发展,已经在合规、技术、服务、教育等方面形成了一套相互支撑的体系。本文从评测视角出发,对其综合实力进行多维度的解读,呈现一个具有结构感的平台画像…...

干货版《算法导论》03:动态数组 × 链表的极致平衡艺术

干货版《算法导论》03:动态数组 链表的极致平衡艺术Bilibili 同步视频🔗 链表 vs 动态数组:天生的矛盾与互补✅ 链表(Linked List)✅ 动态数组(Dynamic Array)📌 关键概念&#xff…...

泛型编程的深度:从容器到元编程的威力

——软件测试从业者的专业解读对于大多数软件测试工程师而言&#xff0c;“泛型”这个词往往与List<T>、Dictionary<TKey, TValue>这些标准容器紧密绑定。在日常的自动化脚本或测试框架开发中&#xff0c;我们熟练地使用它们来存储测试数据、管理页面对象&#xff…...

OpenClaw集成Exa语义搜索:AI驱动的精准信息检索实战

1. 项目概述与核心价值 最近在折腾 OpenClaw 的生态&#xff0c;发现一个痛点&#xff1a;虽然它能联网&#xff0c;但很多时候我们需要的不是简单的网页抓取&#xff0c;而是更精准的、基于语义理解的搜索。比如&#xff0c;你想找“如何用 OpenClaw 搭建一个智能客服系统”&…...

百度地图API高级实战:性能优化、轨迹动画与工程化架构

1. 项目概述&#xff1a;当百度地图API遇上“奇技淫巧”如果你是一名前端或全栈开发者&#xff0c;大概率在某个项目中与百度地图JavaScript API打过交道。官方文档会教你如何初始化地图、添加标注、绘制折线&#xff0c;完成那些“标准动作”。但当你真正投入生产环境&#xf…...

临沂口碑好的展会老根红木哪家专业

在临沂&#xff0c;展会是家居建材行业交流与发展的重要平台&#xff0c;而老根红木等品牌在其中表现卓越&#xff0c;赢得了良好的口碑。下面&#xff0c;让我们深入了解这些专业品牌的魅力所在。一、老根红木背后的强大品牌支撑老根红木隶属于山东老根文化传媒有限公司&#…...

专业水果包装设计公司排名榜推荐:生鲜农产品高端水果礼盒包装首选哲仕、正邦、东道

专业水果包装设计公司排名榜推荐&#xff1a;生鲜农产品高端水果礼盒包装首选哲仕、正邦、东道现在生鲜水果行业竞争激烈&#xff0c;国产时令水果、进口精品水果、产地地标农产品同质化严重。很多水果产地货源优质、口感出众、种植标准高&#xff0c;却因为包装简陋、没有辨识…...

从零搭建静态网站:Hugo + GitHub Pages 实战指南

1. 项目概述&#xff1a;从零构建一个静态个人网站 最近在整理自己的技术项目和博客文章&#xff0c;发现内容散落在各个平台&#xff0c;查阅和管理起来非常不便。于是&#xff0c;我决定动手搭建一个属于自己的静态网站&#xff0c;将所有内容集中展示。最终&#xff0c;我选…...

审核报告怎么写才有价值

审核报告是审核服务的"最终产品"&#xff0c;写得不好&#xff0c;整个审核等于白做&#x1f4ca; 真实场景&#xff1a;有个认证机构的质量总监跟我说&#xff0c;他们抽查了一批审核报告&#xff0c;发现90%的报告都是"复制粘贴模板"——千篇一律的开头、…...

李辉《曾国藩日记》笔记:人人都狭隘,只是程度不一样!

李辉《曾国藩日记》笔记&#xff1a;人人都狭隘&#xff0c;只是程度不一样&#xff01;原文&#xff1a;同治元年九月十八日早饭后清理文件。旋见客&#xff0c;立见者十余次&#xff0c;坐见者两次。写沅弟信一件、左季高信一件。午刻万篪轩来久坐。中饭后阅本日文件。至幕府…...

Uvicorn 完全指南:给小白的第一堂 ASGI 服务器课

&#x1f984; Uvicorn 完全指南&#xff1a;给小白的第一堂 ASGI 服务器课 你写了一个 Python Web 应用&#xff0c;兴冲冲地想把它跑起来&#xff0c;却发现关键词一个接一个蹦出来&#xff1a;ASGI、Uvicorn、Gunicorn、uvloop、httptools…… 它们像一串神秘代码&#xff0…...

Rust构建跨平台AI桌面应用:PoleStar Chat的多机器人协同与本地化实践

1. 项目概述&#xff1a;一个用Rust重写的跨平台AI聊天桌面应用如果你和我一样&#xff0c;每天的工作流里离不开ChatGPT、Claude或者Gemini&#xff0c;那你肯定也受够了在浏览器标签页之间来回切换&#xff0c;或者忍受着某些官方客户端那捉襟见肘的功能和时不时卡顿的体验。…...

从手机快充到笔记本供电:拆解USB PD 3.1 EPR模式下的‘增强功率数据对象’(APDO)

从手机快充到笔记本供电&#xff1a;拆解USB PD 3.1 EPR模式下的‘增强功率数据对象’(APDO) 当你的轻薄本需要240W供电时&#xff0c;传统USB PD协议已经无法满足需求。这正是USB PD 3.1引入EPR&#xff08;扩展功率范围&#xff09;模式的背景——它将功率上限从100W提升至24…...

豆包推出付费会员服务:免费版权益不变,三档会员方案详解

近期&#xff0c;豆包付费话题引发广泛关注。本文梳理豆包官方公布的免费权益、三档付费会员方案及其区别&#xff0c;供读者参考。一、免费版权益说明豆包官方明确表示&#xff0c;免费版服务将持续提供&#xff0c;不会下架、不会阉割功能、不会降低服务质量。所有用户使用同…...

Vivado仿真实战:AXI4 Narrow Transfer的wstrb信号到底怎么用?

Vivado仿真实战&#xff1a;AXI4 Narrow Transfer的wstrb信号深度解析与调试技巧 在FPGA和SoC开发中&#xff0c;AXI4总线协议因其高性能和灵活性成为业界标准。但当我们实际使用Vivado进行仿真时&#xff0c;Narrow Transfer机制下的wstrb信号往往成为调试的"拦路虎"…...

为什么越来越多足浴店,都在用索易软件?

温州索易软件开发有限公司&#xff08;索易软件 SOE&#xff09; 名称释义&#xff1a;索易&#xff08;SOE&#xff09;源自英文 “so easy”&#xff0c;意为 “就这么容易”&#xff0c;是企业核心理念与价值追求。 成立时间&#xff1a;2005年 03 月 24 日 总部地点&…...

从零构建AI助手:LangChain与RAG实战指南

1. 项目概述&#xff1a;一个面向开发者的AI助手实战课程最近在GitHub上看到一个挺有意思的项目&#xff0c;叫Johnxjp/ai-assistant-course。光看名字&#xff0c;你可能会觉得这又是一个讲怎么用ChatGPT聊天的教程。但点进去仔细研究后&#xff0c;我发现它的定位非常精准且务…...

使用 Taotoken CLI 工具一键配置开发环境与模型密钥

使用 Taotoken CLI 工具一键配置开发环境与模型密钥 在接入大模型 API 进行开发时&#xff0c;手动配置 API Key、Base URL 和模型 ID 是常见的步骤。这个过程不仅繁琐&#xff0c;而且在团队协作中&#xff0c;确保每位成员环境配置一致也颇具挑战。Taotoken 提供了一个官方的…...

Clawshell:开源命令行环境配置管理框架,打造可移植的开发工具箱

1. 项目概述&#xff1a;一个开源的“瑞士军刀”式工具箱如果你和我一样&#xff0c;是个喜欢折腾各种工具、脚本&#xff0c;又经常在不同设备间切换的开发者或运维&#xff0c;那你肯定也经历过这样的烦恼&#xff1a;常用的命令、脚本、配置文件散落在各处&#xff0c;每次换…...

从香蕉到芯片:工程师如何用状态识别思维调试FPGA/CPLD系统

1. 从香蕉到芯片&#xff1a;一个工程师的跨界思考前几天在超市&#xff0c;看到有人扛着一大串香蕉&#xff0c;黄澄澄的&#xff0c;形状还有点奇特。这让我一下子走了神&#xff0c;思绪从水果摊飘到了我的工作台——那些排列整齐、闪着金属光泽的FPGA和CPLD开发板。你可能觉…...

从QGIS样式配置到GeoServer发布:手把手教你制作并导出SLD文件

从QGIS样式配置到GeoServer发布&#xff1a;手把手教你制作并导出SLD文件 在GIS工作流中&#xff0c;地图样式的可视化表达与跨平台复用一直是工程师的核心痛点。当你在QGIS中精心调配的渐变色带、分类符号在GeoServer中无法直接复用时&#xff0c;SLD&#xff08;Styled Layer…...

【无人机通信】无人机自主巡航+5G 通信质量监测MATLAB仿真平台,模拟无人机飞 4 个基站,记录信号强度,带 3D 可视化、电子围栏、自动起降、自动返航

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。 &#x1f34e;完整代码获取 定制创新 论文复现点击&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &…...

如何永久保存微信聊天记录?开源工具WeChatMsg完整解决方案

如何永久保存微信聊天记录&#xff1f;开源工具WeChatMsg完整解决方案 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/W…...

《WebPages Razor》深度解析

《WebPages Razor》深度解析 引言 随着互联网技术的飞速发展,Web开发领域不断涌现出新的技术和框架。其中,Razor视图引擎作为一种流行的Web开发工具,受到了广泛的关注。本文将深入解析Razor视图引擎,探讨其在Web开发中的应用、优势以及未来发展趋势。 一、Razor简介 Ra…...

【车辆】大规模连接车辆协作自动化的并行优化算法附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。 &#x1f34e;完整代码获取 定制创新 论文复现点击&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &…...