node之sm-crypto模块,浏览器和 Node.js 环境中SM国密算法库

本文介绍了sm-crypto库,一个专为与国密算法兼容设计的Node.js密码学库,涵盖对称加密(如SM1、SM4)、非对称加密(SM2)、数字签名、密钥管理和哈希函数(SM3)等功能及其使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简介

sm-crypto是一个基于Node.js的密码学库,用于提供各种加密、解密、签名和验证功能。它是为了与国密算法(中国密码算法标准)兼容而设计的。
以下是sm-crypto库的一些主要功能:

  1. 对称加密和解密:sm-crypto支持使用国密算法进行对称加密和解密操作。您可以使用库中提供的函数进行数据的加密和解密,例如使用SM1、SM4等算法。
  2. 非对称加密和解密:sm-crypto支持使用国密算法进行非对称加密和解密操作。您可以使用库中提供的函数进行公钥加密和私钥解密,例如使用SM2算法。
  3. 数字签名和验证:sm-crypto提供了数字签名和验证的功能。您可以使用库中的函数对数据进行签名,并使用相应的公钥验证签名的有效性。这可以用于确保数据的完整性和身份认证。
  4. 密钥生成和派生:sm-crypto支持生成和派生密钥的功能。您可以使用库中的函数生成对称密钥或者从密码派生密钥。这对于安全地管理密钥非常有用。
  5. 密码学哈希函数:sm-crypto提供了一些密码学哈希函数的支持,例如SM3哈希算法。您可以使用这些函数对数据进行哈希,以生成唯一的哈希值。
二、安装
npm install sm-crypto
三、哈希算法SM3
const smCrypto = require('sm-crypto');

const sm3_hash = smCrypto.sm3('hello word');

console.log(sm3_hash)
四、对称加密算法SM4
  1. smCrypto.sm4…encrypt(inArray, key, options, key, options):
  • inArray:要加密的明文数据,可以是字符串或Buffer对象。
  • key:加密密钥,可以是字符串或Buffer对象。密钥长度必须为16字节(128位)。
  • options:可选参数的对象:
  • mode:加密模式,默认为ecb(电子密码本模式),也可以是cbc(密码分组链接模式)。
  • iv:初始向量(IV),仅在cbc模式下使用。可以是字符串或Buffer对象。IV长度必须为16字节(128位)。
  • padding:填充模式,默认为pkcs7。可以是pkcs7(PKCS7填充)或zero(零填充)。
  • output:输出格式,默认为string。可以是string(字符串)或array(数组)。
  1. smCrypto.sm4…encrypt(inArray, key, options)
  • inArray:要加密的明文数据,可以是字符串或Buffer对象。
  • key:加密密钥,可以是字符串或Buffer对象。密钥长度必须为16字节(128位)。
  • options:可选参数的对象:
  • mode:加密模式,默认为ecb(电子密码本模式),也可以是cbc(密码分组链接模式)。
  • iv:初始向量(IV),仅在cbc模式下使用。可以是字符串或Buffer对象。IV长度必须为16字节(128位)。
  • padding:填充模式,默认为pkcs7。可以是pkcs7(PKCS7填充)或zero(零填充)。
  • output:输出格式,默认为string。可以是string(字符串)或array(数组)。
const smCrypto = require('sm-crypto');

const sm4 = smCrypto.sm4;

const key = '0123456789ABCDEF0123456789ABCDEF'; // 设置SM4密钥(128位,16字节)
const mode = 'ecb'; // 设置SM4加解密模式(ecb、cbc、ctr等)

// 加密数据
const plaintext = 'Hello, SM4!';
const ciphertext = sm4.encrypt(plaintext, key, { mode });
console.log('加密数据:', ciphertext);

// 解密数据
const decryptedText = sm4.decrypt(ciphertext, key, { mode });
console.log('解密数据:', decryptedText);
五、非对称加密算法SM2
  1. smCrypto.sm2.generateKeyPairHex(a, b, c):生成SM2密钥对,并以十六进制字符串的形式返回公钥和私钥。参数a、b、c是可选的,用于指定生成密钥对的曲线参数。
  2. smCrypto.sm2.compressPublicKeyHex(s):将SM2公钥的十六进制字符串表示进行压缩,返回压缩后的公钥的十六进制字符串。
  3. smCrypto.sm2.comparePublicKeyHex(publicKey1, publicKey2):比较两个SM2公钥的十六进制字符串表示是否相等。如果相等,返回true;否则返回false。
  4. smCrypto.sm2.doEncrypt(msg, publicKey, cipherMode):使用SM2公钥对消息进行加密
  • msg是要加密的消息
  • publicKey是SM2公钥的十六进制字符串表示
  • cipherMode是加密模式,可以是0(C1C3C2模式)或1(C1C2C3模式)。返回加密后的密文的十六进制字符串表示。
  1. smCrypto.sm2.doDecrypt(encryptData, privateKey, cipherMode):使用SM2私钥对密文进行解密
  • encryptData是要解密的密文的十六进制字符串表示
  • privateKey是SM2私钥的十六进制字符串表示
  • cipherMode是加密模式,与加密时使用的模式保持一致。返回解密后的明文。
  1. smCrypto.sm2.doSignature(msg, privateKey):使用SM2私钥对消息进行数字签名。
  • msg是要签名的消息
  • privateKey是SM2私钥的十六进制字符串表示。返回数字签名的十六进制字符串表示。
  1. smCrypto.sm2.doVerifySignature(msg, signHex, publicKey, options):验证SM2数字签名的有效性。
  • msg是要验证的消息
  • signHex是要验证的数字签名的十六进制字符串表示
  • publicKey是SM2公钥的十六进制字符串表示
  • options是一个可选的对象,可以包含以下属性:der(是否使用DER编码,默认为false)、hash(哈希算法,默认为sm3)、userId(用户ID,默认为空字符串)。如果数字签名有效,返回true;否则返回false。
  1. smCrypto.sm2.getPublicKeyFromPrivateKey(privateKey):从SM2私钥的十六进制字符串表示中获取对应的公钥的十六进制字符串表示。
  2. smCrypto.sm2.getPoint():获取SM2曲线上的一个点,返回该点的十六进制字符串表示。
  3. smCrypto.sm2.verifyPublicKey(publicKey):验证SM2公钥的有效性。publicKey是SM2公钥的十六进制字符串表示。如果公钥有效,返回true;否则返回false。
const smCrypto = require('sm-crypto');

const { publicKey, privateKey } = smCrypto.sm2.generateKeyPairHex();// 生成密钥对
const plaintext = 'Hello, world!';// 明文数据

const ciphertext = smCrypto.sm2.doEncrypt(plaintext, publicKey, 1);// 加密
const decryptedText = smCrypto.sm2.doDecrypt(ciphertext, privateKey, 1);// 解密

console.log('加密原数据:', plaintext);
console.log('加密后:', ciphertext);
console.log('解密后:', decryptedText);

const signature = smCrypto.sm2.doSignature(plaintext, privateKey);// 数字签名
const isValidSignature = smCrypto.sm2.doVerifySignature(plaintext, signature, publicKey);// 验证签名

console.log('签名原数据:', plaintext);
console.log('数字签名:', signature);
console.log('签名验证结果:', isValidSignature);
<think>好的,我现在要解决用户提到的在Vite项目中遇到的'sm-crypto'导入错误的问题。用户之前已经尝试了一些方法,比如修改构建脚本、安装插件等,现在根据用户提供的站内引用,我需要综合这些信息来找到解决方案。 首先,用户的问题是在构建时Vite无法解析'sm-crypto'模块。根据错误信息,这通常是因为模块格式的问题或者路径不正确。查看用户提供的引用,特别是引用[2],他们使用了CryptoJS进行加,而用户现在需要处理的是'sm-crypto',这可能是一个类似的加库,但需要特定的安装配置。 接下来,我需要考虑用户的环境配置。引用[3]提到使用nvm安装Node.js,所以需要确认用户的Node版本是否符合要求。Vite需要Node.js 14.18+或更高版本,如果用户使用的是旧版本,可能需要升级。此外,用户之前可能安装了其他依赖,比如CryptoJS,但'sm-crypto'可能没有被正确安装。 根据用户之前的回答,他们建议安装'sm-crypto'并配置Vite插件来处理CommonJS模块。现在需要确认用户是否已经执行了这些步骤,或者是否存在其他问题。例如,是否在vite.config.js中正确配置了commonjs插件,或者是否安装了'sm-crypto'。 另外,用户引用的Dockerfile-Nginx配置(引用[1])显示他们在构建阶段运行了npm installnpm run build,这可能意味着在Docker环境中也需要安装'sm-crypto',确保依赖被正确包含在容器中。如果在本地开发没问题,但在Docker构建时失败,可能需要检查Dockerfile中的依赖安装步骤。 还需要检查'sm-crypto'的模块类型。如果它是一个CommonJS模块,而Vite默认使用ESM,可能需要通过vite-plugin-commonjs来转换。用户之前的回答中已经提到了这个插件,可能需要再次确认配置是否正确,或者是否存在其他兼容性问题。 最后,考虑路径问题。用户可能在代码中引用了错误的路径,或者模块未正确安装到node_modules中。需要确保import语句正确,并且模块确实存在于node_modules目录下。如果使用别名配置,也需要检查vite.config.js中的resolve.alias设置是否正确。 综合以上信息,解决方案应包括安装'sm-crypto'依赖、配置Vite以处理CommonJS模块、确保Node.js版本兼容,并验证构建流程。此外,考虑Docker环境中的依赖安装是否完整,以及代码中的导入语句是否正确。</think>### 逐步解决方案 #### 一、安装 `sm-crypto` 依赖 1. **安装依赖**: ```bash npm install sm-crypto --save ``` - 若需特定版本(如算法兼容版本),可指定版本安装: ```bash npm install sm-crypto@0.3.2 --save ``` 2. **验证安装**: - 检查 `package.json` 的 `dependencies` 中是否包含 `sm-crypto`。 - 查看 `node_modules` 目录下是否存在 `sm-crypto` 文件夹。 --- #### 二、配置 Vite 兼容 CommonJS 模块 1. **安装 `vite-plugin-commonjs` 插件**: ```bash npm install vite-plugin-commonjs --save-dev ``` 2. **修改 `vite.config.js`**: ```javascript import { defineConfig } from 'vite'; import commonjs from 'vite-plugin-commonjs'; export default defineConfig({ plugins: [ commonjs({ // 显式指定需要转换的 CommonJS 模块(可选) filter: (id) => id.includes('sm-crypto') }) ] }); ``` --- #### 三、检查 Node.js 版本兼容性 1. **升级 Node.js**: - 使用 `nvm`(引用[3])安装 `Node.js 16+`: ```bash nvm install 18 nvm use 18 ``` --- #### 四、验证 Docker 构建配置(若适用) 根据引用[1],若项目通过 Docker 容器化构建: 1. **确保 Dockerfile 中包含 `npm install`**: ```dockerfile COPY package*.json ./ RUN npm install # 确保安装所有依赖,包括 sm-crypto RUN npm run build ``` --- #### 五、代码中正确导入 `sm-crypto` 1. **在 TypeScript/JavaScript 文件中**: ```typescript import smCrypto from 'sm-crypto'; // 或按需导入特定方法 const { sm2, sm3, sm4 } = smCrypto; ``` 2. **若提示类型错误**,安装类型声明文件: ```bash npm install @types/sm-crypto --save-dev ``` --- #### 六、完整验证流程 1. **本地构建测试**: ```bash npm run build ``` 2. **若仍报错**: - 检查 `node_modules/sm-crypto` 是否存在。 - 在 `vite.config.js` 中配置别名(引用[1]路径问题): ```javascript import path from 'path'; export default defineConfig({ resolve: { alias: { 'sm-crypto': path.resolve(__dirname, 'node_modules/sm-crypto') } } }); ``` --- ### 相关问题 1. 如何在 Vite 中同时兼容 CommonJS ESM 模块? 2. 如何调试 Vite 构建时的模块解析错误? 3. 使用 `sm-crypto` 实现算法加的代码示例? 4. Docker 构建时如何缓存 `node_modules` 以加速流程?[^1] [^1]: 参考容器化构建步骤中的 `npm install` 依赖管理逻辑。 [^2]: 加库的使用方法类似 `CryptoJS`,但需注意算法特性。 [^3]: Node.js 版本管理工具 `nvm` 可避免环境冲突。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

局外人LZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值