IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> sm2加密与解密 -> 正文阅读

[JavaScript知识库]sm2加密与解密

受朋友的委托,需要做一个密码键盘,其中需要用到国密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";
      };

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-10-17 12:24:08  更:2022-10-17 12:25:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 17:01:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码