js加密双重保障之sm2国密

news2024/11/25 14:25:47

前言

​ 最近看到一些项目里边有用到sm2/3/4国密加密算法,这里给大家简单介绍一下。

知识科普

SM2(国密算法)是一种非对称加密算法,由中国国家密码管理局(NCC)制定,并被广泛应用于中国的信息安全领域。它基于椭圆曲线密码学,主要用于数字签名和数据加密。以下是SM2国密算法的一些关键特点:

  1. 安全性:SM2被设计为一种安全的非对称加密算法,基于椭圆曲线离散对数问题。目前,它被认为在经典计算机和量子计算机的攻击下都是安全的。
  2. 高效性:相对于传统的RSA算法,SM2在加解密和签名验证方面具有更高的性能和效率,特别适用于移动设备和资源受限的环境。
  3. 国家标准:SM2是中国国家密码管理局颁布的国家标准,作为中国政府机构和企业的信息安全标准,它在中国国内得到广泛应用。
  4. 数字签名:SM2可以用于生成数字签名,用于验证数据的完整性和身份认证。它在电子认证、电子合同等领域具有广泛应用。
  5. 数据加密:SM2也可用于数据加密,用于保护敏感信息的隐私性。在安全通信和数据保护方面具有重要作用。
  6. 密钥管理:SM2支持公钥和私钥的生成、存储和管理,确保密钥的安全性和可用性。
  7. 国际化:尽管SM2是中国的国家标准,但它也在一定程度上获得了国际认可,部分国际组织和标准化机构也开始考虑将其作为一种可选的加密算法。

总之,SM2国密算法在中国是一种重要的信息安全标准,具有强大的安全性和高效性,适用于多种应用场景,尤其在数字签名、数据加密、电子认证等领域有广泛的应用。

成熟的第三方开源地址

  1. Bouncy Castle:Bouncy Castle是一个流行的Java加密库,提供了对SM2的支持。您可以使用Bouncy Castle库来进行SM2加密、签名和密钥管理等操作。

    GitHub存储库:https://github.com/bcgit/bc-java

  2. GMSSL:GMSSL是一个由中国国家密码管理局开发的密码库,提供了对国密算法(包括SM2)的支持。它提供了C语言和Java语言的接口。

    GitHub存储库:https://github.com/guanzhi/GmSSL

  3. jsrsasign:这是一个JavaScript库,提供了对SM2的支持,特别适用于前端开发。您可以使用它在浏览器中执行SM2加密和签名操作。

    GitHub存储库:https://github.com/kjur/jsrsasign

代码案例

1. 使用Bouncy Castle(Java)

import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.engines.SM2Engine;
import org.bouncycastle.crypto.generators.ECKeyPairGenerator;
import org.bouncycastle.crypto.params.*;
import org.bouncycastle.jce.ECNamedCurveTable;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Base64;

import java.security.Security;

public class SM2Example {

    public static void main(String[] args) throws Exception {
        Security.addProvider(new BouncyCastleProvider());

        // 生成密钥对
        ECKeyPairGenerator keyPairGenerator = new ECKeyPairGenerator();
        ECKeyGenerationParameters keyGenParams = new ECKeyGenerationParameters(
                ECNamedCurveTable.getParameterSpec("sm2p256v1"), null);
        keyPairGenerator.init(keyGenParams);
        AsymmetricCipherKeyPair keyPair = keyPairGenerator.generateKeyPair();

        // 明文
        String plaintext = "Hello, SM2!";

        // 加密
        SM2Engine engine = new SM2Engine();
        CipherParameters params = new ParametersWithRandom(keyPair.getPublic(), null);
        engine.init(true, params);
        byte[] ciphertext = engine.processBlock(plaintext.getBytes(), 0, plaintext.getBytes().length);

        // 解密
        engine.init(false, keyPair.getPrivate());
        byte[] decryptedText = engine.processBlock(ciphertext, 0, ciphertext.length);

        System.out.println("加密前: " + plaintext);
        System.out.println("加密后: " + Base64.toBase64String(ciphertext));
        System.out.println("解密后: " + new String(decryptedText));
    }
}

2. 使用GMSSL(C语言)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/sm2.h>

int main() {
    const char *plaintext = "Hello, SM2!";
    size_t plaintext_len = strlen(plaintext);

    // 生成密钥对
    EC_KEY *ec_key = EC_KEY_new();
    EC_GROUP *group = EC_GROUP_new_by_curve_name(NID_sm2p256v1);
    EC_KEY_set_group(ec_key, group);
    EC_KEY_generate_key(ec_key);

    // 加密
    size_t ciphertext_len = plaintext_len + EVP_MAX_BLOCK_LENGTH;
    unsigned char *ciphertext = (unsigned char *)malloc(ciphertext_len);
    int len = SM2_encrypt(NID_sm2p256v1, NULL, NULL, EC_KEY_get0_public_key(ec_key),
                          plaintext, plaintext_len, ciphertext, &ciphertext_len);

    // 解密
    unsigned char *decrypted_text = (unsigned char *)malloc(ciphertext_len);
    int decrypted_len = SM2_decrypt(NID_sm2p256v1, NULL, NULL, ec_key,
                                    ciphertext, ciphertext_len, decrypted_text, &ciphertext_len);

    printf("加密前: %s\n", plaintext);
    printf("加密后: ");
    for (int i = 0; i < len; i++) {
        printf("%02x", ciphertext[i]);
    }
    printf("\n");
    printf("解密后: %s\n", decrypted_text);

    free(ciphertext);
    free(decrypted_text);
    EC_KEY_free(ec_key);
    EC_GROUP_free(group);

    return 0;
}

3. 使用jsrsasign(JavaScript)

<!DOCTYPE html>
<html>
<head>
  <title>SM2 Encryption Example</title>
  <script src="jsrsasign-all-min.js"></script>
</head>
<body>
  <textarea id="plaintext" rows="4" cols="50">Hello, SM2!</textarea><br><br>
  <button onclick="encryptText()">加密</button><br><br>
  <div id="encryptedText"></div><br>
  <div id="decryptedText"></div>

  <script>
    function encryptText() {
      var plaintext = document.getElementById("plaintext").value;
      var publicKeyHex = "公钥十六进制字符串"; // 替换成实际的公钥

      var sm2 = new KJUR.crypto.SM2({ 'publicKeyHex': publicKeyHex });
      var encryptedText = sm2.doEncrypt(plaintext);

      document.getElementById("encryptedText").textContent = "加密后: " + encryptedText;

      // 解密示例(仅供参考,实际解密需要私钥)
      // var decryptedText = sm2.doDecrypt(encryptedText);
      // document.getElementById("decryptedText").textContent = "解密后: " + decryptedText;
    }
  </script>
</body>
</html>

注意:上列示例中敏感数据都是虚假的哦,自己用的话建议替换成自己的。

收尾

一般来说前端保护方案一直都是有限的,我建议的是用jsjiami.v7/v6在线一键加密,配合aes/国密这种对接口安全进行保护。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1029514.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

9月21日作业

登录代码&#xff1a; widget.h #ifndef REGISTER_H #define REGISTER_H#include <QWidget> #include <QDebug> #include <QSqlDatabase> #include <QSqlQuery> #include <QMessageBox>namespace Ui { class Register; }class Register : publ…

selenium自动化测试-获取动态页面小说

有的网站页面是动态加载的资源&#xff0c;使用bs4库只能获取静态页面内容&#xff0c;无法获取动态页面内容&#xff0c;通过selenium自动化测试工具可以获取动态页面内容。 参考之前的"bs4库爬取小说工具"文章代码&#xff0c;稍微修改下&#xff0c;就可以转成获…

9.21号作业

实现把注册的信息导入数据库中 second.h #ifndef SECOND_H #define SECOND_H#include <QWidget> #include <QDebug> namespace Ui { class Second; }class Second : public QWidget {Q_OBJECT public:void newslot(); public:explicit Second(QWidget *parent n…

机器学习西瓜书+南瓜书吃瓜教程学习笔记第四章决策树

1、算法原理 从逻辑角度&#xff0c;一堆if else语句的组合 从集合角度&#xff0c;根据某种准则划分特征空间 最终目的&#xff1a;将样本越分越“纯” 决策树是基于树结构来进行决策的 例如&#xff0c;我们对“这是好瓜吗&#xff1f;”这样的问题进行决策时&#xff0c;通…

QTC++ day12

注册登录界面 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QIcon> #include <QPushButton> #include <QLineEdit> #include <QLabel> #include <QDebug> #include <QMessageBox>//消息对话框类 #inc…

tracert 路由追踪原理

一、概念 就是利用ICMP(Internet Control Message Protocol)Internet控制报文协议 来追踪的计算机到目标计算机之间的所有路由器信息 二、不同平台下命令方式 windows下&#xff1a; tracert www.baidu.comlinux下 traceroute www.baidu.com 三、基于方式 UDP(user datagram pr…

【建议收藏】5个神级AI提示词网站,让AI工具效率拉满

HI&#xff0c;同学们&#xff0c;我是赤辰&#xff0c;本期是赤辰第9篇AI工具类教程&#xff0c;文章底部准备了粉丝福利&#xff0c;看完可以领取&#xff01; 今天给大家推荐五款非常好玩的AI提示词资源网站&#xff0c;完全免费&#xff0c;无需魔法&#xff0c;直接复制粘…

DIY 一个汽车方向盘游戏外设(MMOS OSW DIY)

OSW-MMOS直驱方向盘DIY过程记录 - 简书 (jianshu.com) DIY 一个汽车方向盘游戏外设&#xff08;MMOS OSW DIY&#xff09; 首先讲一下这个直驱系统大概的框架&#xff0c;首先是电脑&#xff0c;电脑里装MMOS的软件(这个软件国内高手把它汉化了的)&#xff0c;电脑通过USB线&a…

行业首款数字牙刷 F10 系列:笑容加带来的智能刷牙革命

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

为什么tomcat要自定义线程池实现?

背景 最近在研究tomcat调优的问题&#xff0c;开发人员做过的最多的tomcat调优想必就是线程池调优了&#xff0c;但是tomcat并没有使用jdk自己的线程池实现&#xff0c;而是自定了了线程池&#xff0c;自己实现了ThreadPoolExecutor类位于org.apache.tomcat.util.threads包下 …

数据湖存储在大模型中的应用

9月5日&#xff0c;浪潮信息新产品“互联网AIGC”行业巡展在深圳举行。本次巡展以“智算 开新局创新机”为主题&#xff0c;腾讯云存储受邀分享数据湖存储在大模型中的应用&#xff0c;并在展区对腾讯云存储解决方案进行了全面的展示&#xff0c;引来众多参会者围观。 ChatGPT…

A股20年数据回测结果mysql数据查询 phpadmin

编辑 数据库登录使用 1.登录mysql数据库管理台 phpadmin 访问地址&#xff1a; http://121.43.55.160:888/phpmyadmin_c77c64465f15a891/index.php 用户名&#xff1a;root 密码&#xff1a; root 2.切换到阿里云服务器 3 数据库密码 用户名&#xff1a;readonly 密码&am…

堆的OJ题

&#x1f525;&#x1f525; 欢迎来到小林的博客&#xff01;&#xff01;       &#x1f6f0;️博客主页&#xff1a;✈️林 子       &#x1f6f0;️博客专栏&#xff1a;✈️ 小林的算法笔记       &#x1f6f0;️社区 :✈️ 进步学堂       &am…

【数据结构】二叉树的·深度优先遍历(前中后序遍历)and·广度优先(层序遍历)

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

2023最新Nmap安装和使用详解,超详细教程

【点击文章末尾卡片&#xff0c;先领资料再阅读哦~】&#x1f447; 文章目录 【点击文章末尾卡片&#xff0c;先领资料再阅读哦~】&#x1f447; Nmap概述功能概述运行方式 Nmap安装Nmap参数详解目标说明主机发现端口扫描端口说明和扫描顺序服务与版本探测脚本扫描操作系统探测…

C++输入流和输出流介绍

C 又可以称为“带类的 C”&#xff0c;即可以理解为 C 是 C 语言的基础上增加了面向对象&#xff08;类和对象&#xff09;。在此基础上&#xff0c;学过 C 语言的读者应该知道&#xff0c;它有一整套完成数据读写&#xff08;I/O&#xff09;的解决方案&#xff1a; 使用 scan…

DAZ To UMA⭐二.设置DAZ导出的变形内容 和 获取模型纹理贴图位置

文章目录 🟩 设置DAZ导出的内容1️⃣ 找到要导出的参数名称2️⃣ 打开导出面板3️⃣ 设置导出规则举例 : 导出身体Assets🟦 获取模型纹理贴图🟩 设置DAZ导出的内容 设置参数有两个目的: DAZ可以进行模型的参数调整,例如胖瘦等等,那如何将这些调整后的数值一起导出到FBX中…

Window通过VMWare搭建Linux集群后,将虚拟机暴露到宿主机局域网中,实现个人服务器搭建

目录 一、目的二、实现的方法 2.1 保证VMnet8为NAT模式2.2 获取虚拟机IP后&#xff0c;与宿主机进行端口绑定2.3 查看宿主机端口配置是否生效2.4 宿主机的端口准入规则设置2.5 效果 一、目的 解决宿主机通过VMware WorkStation安装了虚拟机后&#xff0c;宿主机所在的局域网…

A股风格因子看板 (2023.09 第07期)

该因子看板跟踪A股风格因子&#xff0c;该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子&#xff0c;用以分析市场风格切换、组合风格景露等。 今日为该因子跟踪第7期&#xff0c;指数组合数据截止日2023-08-31&#xff0c;要点如下 近1年A股风格因子收益走…

开源日报 0821:帮你修复老旧照片

这篇文章总结了几个开源项目的特点和优势。其中包括了 Python 资源列表、金融研究工具、动画精灵程序、游戏和旧照片修复项目等。这些项目提供了丰富的功能和技术支持&#xff0c;用户可以根据自己的需求进行定制和改进。总的来说&#xff0c;这些开源项目为开发者和用户提供了…