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

告别明文传输!手把手教你用JS+国密SM2加密登录密码(附C#/Java后端解密代码)

国密SM2算法实战从JS前端加密到C#/Java后端解密的完整指南在当今数字化时代Web应用安全已成为开发者不可忽视的重要课题。每次登录、每次数据传输都可能成为潜在的安全漏洞特别是当敏感信息如用户密码以明文形式在网络中传输时。作为开发者我们有责任为用户构建更安全的数字环境。国密SM2算法作为我国自主设计的非对称加密标准不仅符合国家安全要求更在性能和安全性上展现出独特优势。本文将带你深入理解SM2算法原理并手把手教你实现从JS前端加密到C#/Java后端解密的完整流程解决实际开发中的版本兼容性问题提供可直接复用的代码方案。1. 国密SM2算法核心原理与优势SM2算法是国家密码管理局于2010年发布的椭圆曲线公钥密码算法标准属于国密算法体系中的重要组成部分。与广泛使用的RSA算法相比SM2在相同安全强度下所需的密钥长度更短这意味着更高的加密效率和更低的计算资源消耗。SM2算法的核心特点基于椭圆曲线密码学(ECC)256位密钥强度相当于RSA 3072位加密速度快适合移动端和Web端使用签名速度快特别适合数字证书场景国家认证标准符合等保2.0要求注意SM2算法使用的椭圆曲线方程为y² x³ ax b其中a和b为特定参数不同于国际通用的NIST曲线。在实际应用中SM2采用非对称加密机制前端使用公钥加密敏感数据后端使用私钥解密数据即使公钥被截获没有私钥也无法解密数据// SM2公钥示例格式 const publicKey 04F59485B23304990ED45E42521BE504D0DE358B9E4031A172EF48700071AF985A8EA8B12BB479E24152814EE61840932BFFF5B3B1657C9CF50A61756B1D901E1C;2. 前端JS实现SM2加密完整方案在前端实现SM2加密我们需要引入合适的加密库。目前最成熟的选择是sm-crypto这是一个专为国密算法设计的JavaScript库支持SM2、SM3和SM4算法。2.1 环境准备与库安装首先通过npm安装sm-cryptonpm install sm-crypto --save或者直接在HTML中引入CDN版本script srchttps://cdn.jsdelivr.net/npm/sm-crypto0.3.2/dist/sm-crypto.min.js/script2.2 密钥生成与加密实现在实际项目中应该由后端生成密钥对并将公钥提供给前端。以下是完整的加密示例import { sm2 } from sm-crypto; // 后端提供的公钥 const publicKey 04F59485B23304990ED45E42521BE504D0DE358B9E4031A172EF48700071AF985A8EA8B12BB479E24152814EE61840932BFFF5B3B1657C9CF50A61756B1D901E1C; // 加密用户密码 function encryptPassword(password) { // 加密结果使用16进制字符串表示 const encrypted sm2.doEncrypt(password, publicKey, 0); return encrypted; } // 登录表单提交处理 document.getElementById(loginForm).addEventListener(submit, function(e) { e.preventDefault(); const password document.getElementById(password).value; const encryptedPassword encryptPassword(password); // 将加密后的密码发送到后端 fetch(/api/login, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ username: document.getElementById(username).value, password: encryptedPassword }) }); });常见问题解决方案加密结果每次不同这是正常现象SM2加密过程加入了随机数增强安全性中文加密乱码确保在加密前将字符串转为UTF-8编码公钥格式错误SM2公钥应以04开头长度为130个字符的16进制字符串3. Java后端解密实现与版本适配Java生态中BouncyCastle是支持国密算法的主要库但不同版本存在显著差异需要特别注意兼容性问题。3.1 环境配置与依赖对于Spring Boot项目添加以下依赖dependency groupIdorg.bouncycastle/groupId artifactIdbcprov-jdk15to18/artifactId version1.71/version /dependency重要提示避免使用过旧的bcprov-jdk16-1.46.jar该版本存在已知安全漏洞且对新JDK支持不佳。3.2 解密核心代码实现创建SM2解密工具类import org.bouncycastle.asn1.ASN1EncodableVector; import org.bouncycastle.asn1.ASN1InputStream; import org.bouncycastle.asn1.ASN1Integer; import org.bouncycastle.asn1.DERSequence; import org.bouncycastle.crypto.engines.SM2Engine; import org.bouncycastle.crypto.params.ECPrivateKeyParameters; import org.bouncycastle.crypto.params.ParametersWithRandom; import org.bouncycastle.jce.ECNamedCurveTable; import org.bouncycastle.jce.spec.ECNamedCurveParameterSpec; import org.bouncycastle.math.ec.ECPoint; import java.io.ByteArrayInputStream; import java.math.BigInteger; import java.util.Base64; public class SM2Util { private static final String PRIVATE_KEY 78AEBAE7DE025B6954357DB327F4AE412B3657B1E1ED36F89927C065155DBA9A; public static String decrypt(String encryptedData) throws Exception { // 16进制字符串转字节数组 byte[] encryptedBytes hexStringToBytes(encryptedData); // 获取SM2椭圆曲线参数 ECNamedCurveParameterSpec spec ECNamedCurveTable.getParameterSpec(sm2p256v1); // 创建私钥参数 BigInteger privateKeyD new BigInteger(PRIVATE_KEY, 16); ECPrivateKeyParameters privateKeyParameters new ECPrivateKeyParameters(privateKeyD, spec.getCurve()); // 创建SM2引擎并解密 SM2Engine engine new SM2Engine(); engine.init(false, privateKeyParameters); byte[] decrypted engine.processBlock(encryptedBytes, 0, encryptedBytes.length); return new String(decrypted, UTF-8); } private static byte[] hexStringToBytes(String hexString) { int len hexString.length(); byte[] data new byte[len / 2]; for (int i 0; i len; i 2) { data[i / 2] (byte) ((Character.digit(hexString.charAt(i), 16) 4) Character.digit(hexString.charAt(i 1), 16)); } return data; } }版本兼容性对照表BouncyCastle版本JDK支持范围国密算法支持推荐使用场景1.46-1.52JDK6-8基本支持遗留系统维护1.60-1.68JDK8-11完整支持过渡期项目1.69JDK11优化支持新项目首选4. C#(.NET Core)后端解密实现.NET平台同样通过BouncyCastle库支持SM2算法但需要注意不同版本间的API变化。4.1 环境配置通过NuGet安装BouncyCastledotnet add package BouncyCastle.NetCore --version 1.9.0.14.2 解密核心代码创建SM2解密服务类using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Asn1.X9; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Engines; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Math; using Org.BouncyCastle.Math.EC; using System; using System.Text; public class SM2Decryptor { private static readonly string PRIVATE_KEY 78AEBAE7DE025B6954357DB327F4AE412B3657B1E1ED36F89927C065155DBA9A; public static string Decrypt(string encryptedHex) { // 获取SM2曲线参数 X9ECParameters sm2Parameters Org.BouncyCastle.Asn1.GM.GMNamedCurves.GetByName(sm2p256v1); ECDomainParameters domainParameters new ECDomainParameters( sm2Parameters.Curve, sm2Parameters.G, sm2Parameters.N, sm2Parameters.H); // 创建私钥 BigInteger privateKeyD new BigInteger(PRIVATE_KEY, 16); ECPrivateKeyParameters privateKeyParams new ECPrivateKeyParameters(privateKeyD, domainParameters); // 创建SM2引擎并解密 SM2Engine engine new SM2Engine(); engine.Init(false, privateKeyParams); byte[] encryptedBytes HexToBytes(encryptedHex); byte[] decrypted engine.ProcessBlock(encryptedBytes, 0, encryptedBytes.Length); return Encoding.UTF8.GetString(decrypted); } private static byte[] HexToBytes(string hex) { byte[] bytes new byte[hex.Length / 2]; for (int i 0; i bytes.Length; i) { bytes[i] Convert.ToByte(hex.Substring(i * 2, 2), 16); } return bytes; } }C#实现中的关键点必须使用GMNamedCurves而非SecNamedCurves前者专门为国密算法优化.NET Core 3.1对国密算法有更好支持建议使用最新LTS版本解密后的字节数组需要明确指定UTF-8编码转换5. 全链路安全增强与最佳实践实现SM2加密传输只是Web安全的一个环节要构建真正安全的系统还需要考虑以下方面5.1 密钥安全管理策略公钥动态获取不要在前端硬编码公钥应该通过API动态获取私钥安全存储使用HSM(硬件安全模块)保护私钥或使用云服务商的密钥管理服务(KMS)最低限度应该将私钥存储在环境变量而非代码中5.2 防御中间人攻击即使使用SM2加密仍然需要HTTPS保护传输通道部署有效的SSL证书启用HSTS头强制HTTPS定期更新TLS配置禁用不安全的协议和加密套件5.3 性能优化建议SM2虽然比RSA高效但在高并发场景仍需优化前端实现加密Worker避免主线程阻塞后端考虑缓存密钥参数避免重复初始化对于非敏感数据可以结合SM4对称加密提高性能// Web Worker加密示例 const cryptoWorker new Worker(sm2-worker.js); cryptoWorker.postMessage({ type: encrypt, data: password, publicKey: publicKey }); cryptoWorker.onmessage function(e) { const encrypted e.data; // 提交加密结果 };在实际项目中我们还需要考虑密钥轮换、加密数据日志处理、错误监控等工程化问题。一个完整的加密方案应该既能保障安全又不影响用户体验和系统性能。

相关文章:

告别明文传输!手把手教你用JS+国密SM2加密登录密码(附C#/Java后端解密代码)

国密SM2算法实战:从JS前端加密到C#/Java后端解密的完整指南 在当今数字化时代,Web应用安全已成为开发者不可忽视的重要课题。每次登录、每次数据传输都可能成为潜在的安全漏洞,特别是当敏感信息如用户密码以明文形式在网络中传输时。作为开发…...

别再只写CRUD了!用SpringBoot+MySQL设计一个高并发预约挂号系统,这些架构细节你得知道

高并发预约挂号系统架构实战:SpringBootMySQL核心技术解析 1. 系统架构设计挑战与解决方案 在医疗信息化高速发展的今天,预约挂号系统作为医院服务的"第一窗口",其稳定性与性能直接影响患者就医体验。传统CRUD架构在面对挂号早高峰…...

STL转STEP格式转换终极指南:5分钟掌握专业3D模型转换技巧

STL转STEP格式转换终极指南:5分钟掌握专业3D模型转换技巧 【免费下载链接】stltostp Convert stl files to STEP brep files 项目地址: https://gitcode.com/gh_mirrors/st/stltostp 你是否曾经遇到过这样的困扰?精心设计的3D打印模型在STL格式下…...

Windows CE嵌入式开发:实时USB设备插拔监控与信息持久化实战

1. 项目概述与核心思路 在嵌入式开发,尤其是涉及数据采集、文件交换或外设管理的项目中,实时感知USB设备的插拔状态是一个高频且关键的需求。想象一下,你正在开发一个工业数据记录仪,需要自动将U盘中的数据导入系统,或…...

抖音批量下载终极指南:免费高效获取视频、图集、合集和音乐

抖音批量下载终极指南:免费高效获取视频、图集、合集和音乐 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback …...

HSTracker:macOS炉石传说智能追踪器终极指南,免费提升你的游戏胜率

HSTracker:macOS炉石传说智能追踪器终极指南,免费提升你的游戏胜率 【免费下载链接】HSTracker A deck tracker and deck manager for Hearthstone on macOS 项目地址: https://gitcode.com/gh_mirrors/hs/HSTracker 你是否在炉石传说对战中总是感…...

树莓派CM4刀片服务器设计:从电源管理到集群部署全解析

1. 项目概述:当树莓派计算模块遇上“刀片式”设计如果你和我一样,是个树莓派的老玩家,从最初的Model B一路玩到最新的5代,那你肯定对树莓派计算模块(Compute Module,简称CM)又爱又恨。爱的是它把…...

别再乱用sleep了!Linux C++高精度延时实战指南(从usleep到std::sleep_for的避坑总结)

Linux C高精度延时实战:从传统陷阱到现代方案 在开发高性能服务器、嵌入式实时系统或音视频处理程序时,精确控制时间延迟是保证系统稳定性和响应速度的关键。许多开发者在使用sleep、usleep等延时函数时,常常遇到CPU占用率飙升、时序漂移或信…...

CompressO:你的数字瘦身专家,如何将臃肿媒体文件压缩90%而不失品质?

CompressO:你的数字瘦身专家,如何将臃肿媒体文件压缩90%而不失品质? 【免费下载链接】compressO Convert any video/image into a tiny size. 100% free & open-source. Available for Mac, Windows & Linux. 项目地址: https://gi…...

别再手动敲命令了!用Kuboard-Spray v1.2.4图形化搞定K8s集群(附CentOS 7.9避坑实录)

图形化利器Kuboard-Spray v1.2.4:三分钟搭建生产级K8s集群的避坑指南 当你在凌晨三点盯着满屏的kubeadm init报错信息时,是否想过Kubernetes集群部署还能更简单?去年我们团队在客户现场部署一套生产环境时,传统命令行方式让我们在…...

PowerSetting下载慢?CDN加速+离线包分发方案

运维团队最怕什么?不是流量高峰,而是高峰期偏偏遇到软件包下载失败、更新卡死、内网带宽被打满。PowerSetting这类工具包虽然不大,但在大规模批量部署时,每一次从公网拉取都是一次不确定的赌博,网络抖动、节点失效、外…...

KMS_VL_ALL_AIO:Windows和Office永久激活终极指南

KMS_VL_ALL_AIO:Windows和Office永久激活终极指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活和Office软件授权问题烦恼吗?KMS_VL_ALL_AIO是一…...

别再让ROS2节点间通信拖慢你的机器人:手把手配置Fast DDS共享内存传输(附XML配置文件)

ROS2高性能通信实战:Fast DDS共享内存传输深度优化指南 当机器人系统需要处理高频率的激光雷达点云或4K摄像头图像时,传统网络传输方式可能成为性能瓶颈。我曾在一个工业分拣机器人项目中发现,仅图像传输就占用了30%的CPU资源,这促…...

用一台旧笔记本和朋友联机玩《我的世界》Fear Nightfall整合包,保姆级开服教程(含SakuraFrp配置)

用旧笔记本搭建《我的世界》Fear Nightfall联机服务器的完整指南 1. 为什么选择旧笔记本作为服务器主机? 对于许多《我的世界》玩家来说,和朋友一起体验大型整合包是件令人兴奋的事,但租用云服务器的高昂成本往往让人望而却步。实际上&…...

如何通过PrismLauncher-Cracked实现Minecraft完全离线启动?终极解决方案

如何通过PrismLauncher-Cracked实现Minecraft完全离线启动?终极解决方案 【免费下载链接】PrismLauncher-Cracked This project is a Fork of Prism Launcher, which aims to unblock the use of Offline Accounts, disabling the restriction of having a function…...

保姆级教程:搞定EVE-NG客户端与SecureCRT/Wireshark的完美关联(附常见问题修复)

EVE-NG高阶工具链集成:SecureCRT与Wireshark深度调优指南 当网络工程师从基础实验迈入复杂拓扑模拟时,EVE-NG与专业工具链的协同工作能力直接决定实验效率。本文将深入解析SecureCRT会话管理与Wireshark抓包分析两大核心组件的集成优化方案,涵…...

3分钟完成智能图像分层:Layerdivider一键PSD生成终极指南

3分钟完成智能图像分层:Layerdivider一键PSD生成终极指南 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 你是否曾面对一张精美的插画&#x…...

终极Windows与Office智能激活解决方案:KMS_VL_ALL_AIO全面解析与实战指南

终极Windows与Office智能激活解决方案:KMS_VL_ALL_AIO全面解析与实战指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO KMS_VL_ALL_AIO是一款功能强大的Windows与Office智能激活脚…...

Perplexity习语查询响应延迟超800ms?3个冷启动配置错误正在 silently 毁掉你的语言生产力

更多请点击: https://kaifayun.com 第一章:Perplexity习语查询功能概览 Perplexity 的习语查询功能专为语言学习者与内容创作者设计,支持对英语中高频、多义、文化负载型习语进行上下文感知的精准解析。该功能不仅返回标准释义,还…...

【Perplexity语言学习资源黄金组合】:搭配Anki+TTS+语法解析器的「零依赖」自主学习系统(仅需1台设备)

更多请点击: https://codechina.net 第一章:Perplexity语言学习资源黄金组合的系统定位与核心价值 Perplexity 作为一款以实时检索增强生成(RAG)为核心架构的AI问答引擎,其在语言学习领域的独特价值并非源于通用对话能…...

AI赋能能耗管理:解锁智能照明低碳运维新范式

摘要在双碳战略全面落地、智慧楼宇数字化转型的浪潮下,智能照明已广泛应用于商业园区、市政道路、写字楼等各类场景。传统照明能耗管理模式粗放,存在能耗数据模糊、浪费隐蔽、管控滞后、节能无依据等痛点,大量无效耗电持续增加运营成本。新一…...

MapStruct实战:手把手教你处理SpringBoot API中的字段名不一致问题

MapStruct实战:SpringBoot API字段名不一致的优雅解决方案 在SpringBoot开发中,前后端数据交互时经常遇到字段命名规范不一致的问题。数据库使用user_name,前端却要求userName;或者需要隐藏敏感字段如password,转换成*…...

告别C盘爆满!VSCode插件和用户数据迁移到D盘的保姆级教程(附注册表修改)

告别C盘爆满!VSCode插件和用户数据迁移到D盘的保姆级教程 每次打开VSCode都看到C盘空间告急的红色警告?作为开发者,我们往往会在不知不觉中安装几十个甚至上百个插件,这些插件和用户数据默认都存储在C盘,日积月累就会…...

Python操控AB PLC避坑指南:pylogix读写数组、字符串和UDT的实战细节

Python操控AB PLC避坑指南:pylogix读写数组、字符串和UDT的实战细节 当工业自动化遇上Python,pylogix库成为了连接AB PLC与Python世界的桥梁。但在处理数组、字符串和用户自定义数据类型(UDT)时,即便是经验丰富的开发…...

在树莓派4B上实战:用Electron-builder打包Linux ARM应用(含Wayland配置)

树莓派4B实战:Electron应用打包与Wayland适配全指南 树莓派4B作为一款性价比极高的ARM开发板,已经成为许多开发者和爱好者的首选平台。随着Electron框架的普及,越来越多的开发者希望将自己的桌面应用移植到树莓派上运行。本文将带你从零开始&…...

Miniconda虚拟环境配置踩坑实录:从‘CondaHTTPError’到完美隔离环境

Miniconda虚拟环境配置踩坑实录:从‘CondaHTTPError’到完美隔离环境 第一次在终端输入conda create -n myenv python3.8时,满心期待能快速搭建起一个干净的Python工作环境。然而几秒钟后,屏幕上突然跳出的红色报错信息让整个流程戛然而止&a…...

3分钟搞定Steam游戏清单!Onekey工具让游戏文件管理变得如此简单

3分钟搞定Steam游戏清单!Onekey工具让游戏文件管理变得如此简单 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 还在为复杂的Steam游戏文件管理而烦恼吗?想要备份游戏清单…...

openpilot深度解析:开源驾驶辅助系统的技术实现与架构设计

openpilot深度解析:开源驾驶辅助系统的技术实现与架构设计 【免费下载链接】openpilot openpilot is an operating system for robotics. Currently, it upgrades the driver assistance system on 300 supported cars. 项目地址: https://gitcode.com/GitHub_Tre…...

PentAGI:面向红队实战的开源渗透测试Agent系统

1. 这不是另一个“AI安全”的概念玩具,而是一套能真正进红队实战的渗透测试Agent系统你有没有遇到过这样的场景:在一次内部红队演练中,刚摸到一台边缘业务服务器,想快速判断它是否暴露了Jenkins未授权访问、Confluence远程代码执行…...

3种简单方法解决Navicat Premium Mac试用期重置难题

3种简单方法解决Navicat Premium Mac试用期重置难题 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac 你是否正在为Navicat Pre…...