问题:前端提交请求时,用户名及密码到后台的过程明文传输,不安全,所以通过对账号和密码进行SM2加密后再进行提交,后台接收后再进行解密获取。

SM2加密知识:https://blog.csdn.net/mogoweb/article/details/105108689

SM2代码和文章借鉴源地址:    https://blog.51cto.com/boytnt/2503384

https://github.com/Saberization/SM2

正文:

总的来说就是通过一定的算法获取到两个密钥,一个叫公钥,一个叫私钥。公钥留给前端进行进行加密,私钥留给后端进行解密。

首先先添加maven依赖:(最好使用1.60之后的版本,1.56版本测试缺少包)

        <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.67</version></dependency>

然后公钥给前端之前,我们需要先生成公钥和私钥(不用问,借鉴来的(老脸一红)):

        X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1");ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), sm2ECParameters.getG(), sm2ECParameters.getN());ECKeyPairGenerator keyPairGenerator = new ECKeyPairGenerator();keyPairGenerator.init(new ECKeyGenerationParameters(domainParameters, SecureRandom.getInstance("SHA1PRNG")));AsymmetricCipherKeyPair asymmetricCipherKeyPair = keyPairGenerator.generateKeyPair();//上面的代码都是直接用maven依赖中的包直接import就可以用了
//还有一些更底层的写法,可以自己搜索一下,图方便的这个挺好的//私钥,16进制格式,自己保存BigInteger privatekey = ((ECPrivateKeyParameters) asymmetricCipherKeyPair.getPrivate()).getD();String privateKeyHex = privatekey.toString(16);System.out.println("private Key :" + privateKeyHex);//公钥,16进制格式,发给前端ECPoint ecPoint = ((ECPublicKeyParameters) asymmetricCipherKeyPair.getPublic()).getQ();String publicKeyHex = Hex.toHexString(ecPoint.getEncoded(false));System.out.println("Public Key :" + publicKeyHex);

这个时候,我们手持公钥和私钥,大手一挥,扔给前端一个公钥。

前端说,你等等,我先准备一下:

然后就添加了这两个js

<script type="text/javascript" src="自己的地址/crypto-js.js"></script>
<script type="text/javascript" src="自己的地址/sm2.js"></script>
        var psd = $('#password').val();var publichex = '后端获取到的公钥写这块';var password = sm2Encrypt(psd,publichex,0);

前端通sm2Encrypt加密完成后,现在的password就是一大串字符 。

然后这时候给后端,提交过程中就算你获取到了你也解不开,因为你没有私钥~~~

后端呢,获取到了一大串字符的password之后,就开始进行解密(还是借鉴来的代码(稍作更改)):

        String cipherData = "从前端获取的加密后的字符串";byte[] cipherDataByte = Hex.decode(cipherData);//刚才的私钥Hex,先还原私钥String privateKey = "先前获取的私钥写在这里";BigInteger privateKeyD = new BigInteger(privateKey, 16);X9ECParameters sm2ECParameters1 = GMNamedCurves.getByName("sm2p256v1");ECDomainParameters domainParameters1 = new ECDomainParameters(sm2ECParameters1.getCurve(), sm2ECParameters1.getG(), sm2ECParameters1.getN());ECPrivateKeyParameters privateKeyParameters = new ECPrivateKeyParameters(privateKeyD, domainParameters1);//用私钥解密SM2Engine sm2Engine = new SM2Engine();sm2Engine.init(false, privateKeyParameters);//processBlock得到Base64格式,记得解码byte[] arrayOfBytes =Base64.decodeBase64(sm2Engine.processBlock(cipherDataByte, 0, cipherDataByte.length));//得到明文:SM2 Encryption TestString data = new String(arrayOfBytes);

这个时候就获得了前端界面提交上来的密码,并且传输过程中现实的是一串16进制的字符串,解决了明文传输,实现了加密传输的问题。

SM2国密——前端加密,后端解密(备忘)相关推荐

  1. java和js实现前端加密后端解密,后端加密前端解密(Base64)

    目录 1.前端加密后端解密 2.后端加密前端解密 在前端和后端数据传输时,常常涉及到隐私数据的传输(例如用户名和密码),这时,我们就需要对隐私数据进行加密解密 1.前端加密后端解密 1.1 前端jqu ...

  2. RSA前端加密后端解密

    前面说过接口数据在后端如何使用RSA加解密 这里遇到了使用RSA前端加密后端解密的需求. 实现方式如下: 1.后端的RSA工具 package com.ieslab.interactivequery. ...

  3. RSA解密中文乱码解决,前端加密后端解密

    var name = '中文测试'var nameen = encodeURIComponent(name);var name = encrypt.encrypt(nameen); 先用encodeU ...

  4. 国密算法加密、解密、加签、验签

    理论就不说了:我也看不懂,这两篇够了 https://blog.51cto.com/u_13929722/3422122 https://blog.csdn.net/w57685321/article ...

  5. SM2国密算法加解密

    接口安全设计原则的一个点就是数据不能明文传输,除了https这个必须的请求外,接口数据加密也是一个重要的方式,下面介绍一下SM2国密算法加解密的使用方式. 这里我就针对目前前后端分离架构的方式来简单介 ...

  6. js 使用sm2 国密加密

    js 使用sm2 国密加密 由于项目中要对数据进行国密加密 注意: 同一个明文,加密后的密文都不同,解密的话要用私钥解密 js用sm2加密,首先要从后端获取公钥,用公钥加密 参考资料 crypto-j ...

  7. C#.NET 国密SM4加密解密 CBC ECB 2种模式

    注意点: 1.加密时,明文转 byte[] 时,不要用 Encoding.Default,一定要指定编码,如:UTF-8. 解密时,解出的 byte[] 转 string 同样要指定相同的编码. 2. ...

  8. 技术分享 | 使用 mPaaS 配置 SM2 国密加密指南

    简介:随着移动智能终端的广泛应用,敏感信息极易被监控或盗取,给国家.企事业及个人带来极大政治.经济损失.金融和重要领域的各个企业正在逐步落实并完成国产密码改造工作.为解决客户侧因更换加密算法造成的种种 ...

  9. 一文搞懂国密SM加密(VIP典藏版)

    目录 一.前言 加密概述 对称算法(分组密码算法):AES/DES/3DES/SM4/SM4 非对称算法(公钥密码算法):RSA/DSA/ECC/SM2 摘要算法(杂凑算法):MD5/SHA-I/SM ...

最新文章

  1. macOS Big Sur 使用全新虚拟化框架创建超轻量虚拟机!
  2. python 文字语音朗读-怎么用 Python 来朗读网页 ?
  3. Linux ps aux指令詳解--转
  4. 晋职称计算机过几,晋职称怎样考计算机 昨日记者采访市人事局有关负责人
  5. java增删改查_Java程序员你真的甘心只做增删改查吗
  6. Android源码解析--SwipeMenuListView仿QQ聊天左滑
  7. 使用BufferedImage进行渐变色操作
  8. Force.com 多租户架构
  9. python字符编码正确的是_python字符编码
  10. MySQL命令行格式化输出
  11. suse linux 分区表格式
  12. 白日门传奇手游源码端
  13. ASP.NET 省市区联级
  14. Python编程视频教程零基础从入门到实战自学课程
  15. linux目录更改权限不够,Linux中文件夹访问权限不足
  16. 华为手机备份的通讯录是什么文件_华为通讯录怎么导入新手机(三种方法帮你导通讯录)...
  17. springboot banner制作
  18. android 设计师是处女座的,处女座速成法!设计师的像素眼是怎样炼成的?
  19. Python中用Matplotlib做多个纵轴(多y轴)
  20. 机器学习回归预测_通过机器学习回归预测高中生成绩

热门文章

  1. OAI搭建 SIM卡(2018-11更新版)
  2. c语言char* 转char[]方法
  3. 通过 NFS 实现服务器目录共享
  4. haxe怎么读_for循环 · Haxeamp;NEKO · 看云
  5. 复位方式、时钟复位流程
  6. 公网出口ip与本机ip的区别
  7. 「避坑干货」2022华强北耳机快速扫盲
  8. Mac中git ssh配置
  9. 招聘微码开发工程师---华为三康技术有限公司
  10. Android之---项目开发中网络框架的选择