前端vue与后端java,系统登录使用国密算法SM2加密登录信息

参考:https://cloud.tencent.com/developer/article/2330359

1:后端

1.1 后端maven配置

<dependency>
    <groupId>com.antherd</groupId>
    <artifactId>sm-crypto</artifactId>
    <version>0.3.2</version>
</dependency>

1.2 后端java代码

import com.antherd.smcrypto.sm2.Keypair;
import com.antherd.smcrypto.sm2.Sm2;


import cn.util.Sm2Util;
import cn.hutool.core.codec.Base64;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;



Keypair keypair = Sm2.generateKeyPairHex();
// 私钥
//f6eeeee13a7c074078fdf2e6b3fcb55349871b9e99f70e23e2a5b07848e13860
String privateKey = keypair.getPrivateKey();
// 公钥
// 043ae110e9e4abfcc4df672018f1157f64d5a859764c962b85dc8939317a48060c4d5066c7720dc40103c7597952ad3979201f9d0350818d0367acaf918622d07e 
String publicKey = keypair.getPublicKey(); 
//解密
String plainText = Sm2.doDecrypt(cipherText, privateKey);
//String doEncrypt = Sm2.doEncrypt("明文", publicKey);



//下面是处理前端发过来的数据
//对parameters进行解密
String cipherText = parameters.get("cipherText").toString();
String publicKey = parameters.get("publicKey").toString();
//这里有一个工具类保存着公钥与私钥的信息,通过公钥得到私钥信息才能进行解密
String plainText = Sm2Util.decryptWithCache(cipherText,publicKey);
	
String decodeStr = Base64.decodeStr(plainText);
		
//解密为JSONObject就可以取每个属性的值了
JSONObject jsonObject = null;
try {
	jsonObject = JSONUtil.parseObj(URLDecoder.decode(decodeStr,"UTF-8"));
} catch (UnsupportedEncodingException e) {
	e.printStackTrace();
}

//恢复为明文username, password,verifyCode,cipherText,publicKey
parameters.put("username",jsonObject.get("username").toString());
parameters.put("password",jsonObject.get("password").toString());
parameters.put("verifyCode",jsonObject.get("verifyCode").toString());


2 前端

2.1 安装加密包

npm install --save sm-crypto
在package.json文件中增加了:
...
...
"sm-crypto": "^0.3.13",
...
...

2.2 前端代码

import {sm2} from 'sm-crypto'


//解密功能不用
//let decryptData = sm2.doDecrypt(encryptData, privateKey, 1) // 解密结果

//公钥,每次刷新验证码时就刷新前端的公钥
//publicKey = 043ae110e9e4abfcc4df672018f1157f64d5a859764c962b85dc8939317a48060c4d5066c7720dc40103c7597952ad3979201f9d0350818d0367acaf918622d07e

//把登录信息加密。
let loginFormVo =  {
            username: '',
            password: '',
            verifyCode: ''
          };
loginFormVo.username = this.loginForm.username;
loginFormVo.password = this.loginForm.password;
loginFormVo.verifyCode = this.loginForm.verifyCode;
//把登录信息转为base64编码格式
let plainText = btoa(encodeURIComponent(JSON.stringify(loginFormVo)));
//加密数据
let cipherText = sm2.doEncrypt(plainText, publicKey, 1);
//把加密数据发给后端
this.loginForm.cipherText = cipherText;
this.$store.dispatch('user/login', this.loginForm).then(() => {
...
....
})


3 github地址

前端依赖包
https://github.com/JuneAndGreen/sm-crypto
后端依赖包
https://github.com/antherd/sm-crypto

4 总结。这个方式不需要再处理BCD 04之类的问题,集成起来比较简单。没有使用org.bouncycastle包。后端生成公钥与私钥,前端得到公钥之后加密数据,后端私钥进行解密。每次刷新验证码的同时都重新生成一次密钥对儿。附件中包含了前后端加密包。多谢网友的分享。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值