问题:前端提交请求时,用户名及密码到后台的过程明文传输,不安全,所以通过对账号和密码进行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. hdu1715 大菲波数
  2. Java时间日期格式转换
  3. Smarty 生成静态页
  4. 【机器学习】怎样将Embedding融入传统机器学习框架?
  5. javascript:this 关键字
  6. java 导出excel教程_Java导出Excel表格
  7. 图解 SpringMVC 五大组件
  8. 人工智能的炒作_人工智能与网络安全结合从炒作走向现实
  9. 拓端tecdat|虎扑社区论坛数据爬虫分析报告
  10. “SD卡已损坏。可能需要重新格式化卡” 解决办法!
  11. TLC5615输出256点正弦波(振幅和频率可调)
  12. 电脑硬盘为什么要分区
  13. JavaScript弹窗提示
  14. C语言如何编程换算小时秒,小时分钟秒的换算(c语言把时间转换成秒)
  15. 基金套利是怎么玩的?
  16. JavaScript jQuery遍历对象each()方法
  17. 小米电脑重装系统后亮度无法调节的解决办法
  18. ThinkPHP3.2/ThinkPHP5对比
  19. Red Hat Enterprise Linux 8(简称RHEL 8,中文名红帽企业Linux 8)的分享链接
  20. 香橙派笔记5:语音助手刷抖音

热门文章

  1. 用 Python 读取 Excel 自动生成 Web 可视化页面!
  2. 安卓面试总结(1)——Java基础
  3. tcpcopy mysql_利用tcpcopy引流过程
  4. 生产计划和控制,是一个体系
  5. 学业计算机水平考试试题,计算机水平考试试题汇编
  6. macOS开发 NSTextField设置光标颜色
  7. 思迈特软件Smartbi:人口热力图怎么做,这个热力图软件太方便了
  8. java 投影转换算法_java – 如何将3D点转换为2D透视投影?
  9. Activity面试题库
  10. 博弈论——《取石子》《取石子游戏》