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

bingbao 2024-07-20 08:33:03 阅读 60

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

1:后端

1.1 后端maven配置

<code><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包。后端生成公钥与私钥,前端得到公钥之后加密数据,后端私钥进行解密。每次刷新验证码的同时都重新生成一次密钥对儿。附件中包含了前后端加密包。多谢网友的分享。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。