前端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包。后端生成公钥与私钥,前端得到公钥之后加密数据,后端私钥进行解密。每次刷新验证码的同时都重新生成一次密钥对儿。附件中包含了前后端加密包。多谢网友的分享。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。