受朋友的委托,需要做一个密码键盘,其中需要用到国密sm2来进行前后端数据的通信,琢磨了一整天,特此记录,以便之后来查阅~
1.工具库
? ? ? ?(1)?jquery-3.6.0.min.js??
? ? ? ?(2) jsencrypt.min.js
<script src="https://cdn.jsdelivr.net/npm/jsencrypt@3.2.1/bin/jsencrypt.min.js"></script>
? ? ? ? (3)?node-rsa? (npm包)
2.交互逻辑
? ? ? ? 大概就是后端生成公钥和私钥,之后将公钥传递给前端,前端拿到公钥对数据进行加密,之后传递加密过的数据到后端,后端使用私钥进行解密,整个数据传输过程原数据全程不会暴露,简直安全的一批!
3.实现
? ? ? (1)? 先把后端搭建起来
需要用到的库
koa,? node框架 koa-router,? 路由 koa-cors,? ?解决跨域 koa-bodyparser ,? 解析传递参数
const koa = require("koa");
const router = require("koa-router")();
const cors = require("koa-cors");
const bodyparser = require("koa-bodyparser");
const {doDecryptStr,publicKey } = require("./excode");
let app = new koa();
router.post("/login", async (ctx, next) => {
let { value } = ctx.request.body;
let res = doDecryptStr(value);
console.log("加密的数据"+value);
console.log("解密后的数据"+res);
ctx.body = {
code: 1000,
msg: res,
};
});
router.post("/", async (ctx, next) => {
ctx.body = {
code: 200,
msg: publicKey,
};
});
app.use(cors());
app.use(bodyparser());
app.use(router.routes());
let port = 1228;
app.listen(port);
console.log(`本次服务器将运行在:http://localhost:${port}`);
之后生成公钥和私钥
依赖:node-rsa
const NodeRSA = require("node-rsa");
const key = new NodeRSA({b: 512});//生成512位秘钥
const publicKey = key.exportKey('pkcs8-public');//导出公钥
const _prikey = key.exportKey('pkcs8-private');//导出私钥
function doDecryptStr(baseStr) {
const privateKey = new NodeRSA(_prikey);
privateKey.setOptions({ encryptionScheme: "pkcs1" }); // 因为jsencrypt自身使用的是pkcs1加密方案, nodejs需要修改成pkcs1。
decrypted = privateKey.decrypt(baseStr, "utf8");
return decrypted;
}
module.exports = {
publicKey,
doDecryptStr,
};
? ? ? ? (2)前端部分逻辑
刚打开页面需要拿到后端生成的公钥,所以...
?_pubKey? :用来存放公钥的变量
var _pubKey;
$.post("http://localhost:1228/", (res) => {
console.log(res);
_pubKey = res.msg;
});
输入完成点击登录时...
将加密的数据传递至后端,之后就交给后端来解密了~
let login = () => {
var encrypt = new JSEncrypt();
encrypt.setPublicKey(_pubKey);
var res = encrypt.encrypt(pswd.value);
$.post("http://localhost:1228/login", { value: res }, (res) => {
console.log(res);
});
btn.style.opacity = "0%";
key.style.bottom = "-270px";
};
|