NodeJS 加密 —— crypto 模块

angular实现国密算法sm2、sm3和sm4的ts版,基于sm-crypto库实现,前后端实现 ts版,js的话直接根据npm文档调用就可以了! ts提供的方法有问题,所以还换了个思路来实现!而且因为不是nodeJs环境所以const sm4 = require('sm-crypto').sm4这个在ts里是报错的导致无法实现,如果是使用的是electron那么使用const sm4 = window.require('sm-crypto').sm4就可以来调用js里的方法了。 npm文档:sm-crypto 前提:方法入口出口都是通过ts的Buffer来传递的也就是字节数组Uint8Array,并且 阅读详情

在这里插入图片描述


阅读原文


加密简介

加密是以某种算法改变原有的信息数据,使得未授权用户即使获得了已加密信息,因不知解密的方法,无法得知信息真正的含义,通过这种方式提高网络数据传输的安全性,加密算法常见的有哈希算法、HMAC 算法、签名、对称性加密算法和非对称性加密算法,加密算法也分为可逆和不可逆,比如 md5 就是不可逆加密,只能暴力破解(撞库),我们在 NodeJS 开发中就是直接使用这些加密算法,crypto 模块提供了加密功能,包含对 OpenSSL 的哈希、HMAC、加密、解密、签名以及验证功能的一整套封装,核心模块,使用时不需安装。


哈希算法

哈希算法也叫散列算法,用来把任意长度的输入变换成固定长度的输出,常见的有 md5、sha1 等,这类算法实现对原数据的转化过程是否能被称为加密备受争议,为了后面叙述方便我们姑且先叫做加密。

// 查看哈希加密算法的种类
const crypto = require("crypto");

// getHashes 方法用于查看支持的加密算法
console.log(crypto.getHashes());

// [ 'DSA', 'DSA-SHA', 'DSA-SHA1', 'DSA-cSHA1-old',
//   'RSA-MD4', 'RSA-MD5', 'RSA-MDC2', 'RSA-RIPEMD160',
//   'RSA-SHA', 'RSA-SHA1', 'RSA-SHA1-2', 'RSA-SHA224',
//   'RSA-SHA256', 'RSA-SHA384', 'RSA-SHA512',
//   'dsaEncryption', 'dsaWithSHA', 'dsaWithSHA1', 'dss1',
//   'ecdsa-with-SHA1', 'md4', 'md4WithRSAEncryption',
//   'md5', 'md5WithRSAEncryption', 'mdc2', 'mdc2WithRSA',
//   'ripemd', 'ripemd160', 'ripemd160WithRSA', 'rmd160',
//   'sha', 'sha1', 'sha1WithRSAEncryption', 'sha224',
//   'sha224WithRSAEncryption', 'sha256',
//   'sha256WithRSAEncryption', 'sha384',
//   'sha384WithRSAEncryption', 'sha512',
//   'sha512WithRSAEncryption', 'shaWithRSAEncryption',
//   'ssl2-md5', 'ssl3-md5', 'ssl3-sha1', 'whirlpool' ]

md5 是开发中经常使用的算法之一,官方称为摘要算法,具有以下几个特点:

  • 不可逆;
  • 不管加密的内容多长,最后输出的结果长度都是相等的;
  • 内容不同输出的结果完全不同,内容相同输出的结果完全相同。

由于相同的输入经过 md5 加密后返回的结果完全相同,所以破解时通过 “撞库” 进行暴力破解,当连续被 md5 加密 3 次以上时就很难被破解了,所以使用 md5 一般会进行多次加密。

// md5 加密 —— 返回 Buffer
const crytpo = require("crytpo");

let md5 = crytpo.createHash("md5"); // 创建 md5
let md5Sum = md5.update("hello"); // update 加密
let result = md5Sum.digest(); // 获取加密后结果

console.log(result); // <Buffer 5d 41 40 2a bc 4b 2a 76 b9 71 9d 91 10 17 c5 92>

digest 方法参数用于指定加密后的返回值的格式,不传参默认返回加密后的 Buffer,常用的参数有 hex 和 Base64,hex 代表十六进制,加密后长度为 32,Base64 的结果长度为 24,以 == 结尾。

// md5 加密 —— 返回十六进制
const crypto = require("crypto");

let md5 = crypto.createHash("md5");
let md5Sum = md5.update("hello");
let result = md5Sum.digest("hex");

console.log(result); // 5d41402abc4b2a76b9719d911017c592
// md5 加密 —— 返回 Base64
const crypto = require("crypto");

let md5 = crypto.createHash("md5");
let md5Sum = md5.update("hello");
let result = md5Sum.digest("Base64");

console.log(result); // XUFAKrxLKna5cZ2REBfFkg==

update 方法的返回值就是 this,即当前实例,所以支持链式调用,较长的信息也可以多次调用 update 方法进行分段加密,调用 digest 方法同样会返回整个加密后的值。

// 链式调用和分段加密
const crypto = require("crypto");

let result = crypto
    .createHash("md5")
    .update("he")
    .update("llo")
    .digest("hex");

console.log(result); // 5d41402abc4b2a76b9719d911017c592

由于可以使用 update 进行分段加密,就可以结合流来使用,其实 crypto 的本质是创建 Transform 类型的转化流,可以将可读流转化成可写流。

// 对可读流读取的数据进行 md5 加密
const crypto = require("crypto");
let fs = require("fs");

let md5 = crypto.createHash("md5");
let rs = fs.createReadSteam("./readme.txt", {
    highWaterMark: 3
});

// 读取数据并加密
rs.on("data", data => md5.update(data));

rs.on("end", () => {
    let result = md5.digest("hex");
    console.log(result);
});

使用场景 1:经常被使用在数据的校验,比如服务器与服务器之间进行通信发送的明文摘要加 md5 加密摘要后的暗文,接收端拿到数据以后将明文摘要按照相同的 md5 算法加密后与暗文摘要对比验证,目的是防止数据传输过程中被劫持并篡改。
使用场景 2:在浏览器缓存策略中,可以通过对静态资源的信息摘要使用 md5 加密,每次向服务器发送加密后的密钥进行比对就可以了,不至于对整个文件内容进行比较。

缺点:由于规定使用 md5 的哈希算法加密,别人可以使用同样的算法对信息进行伪造,安全性不高。


Hmac 算法

1、Hmac 算法的使用

Hmac 算法又称加盐算法,是将哈希算法与一个密钥结合在一起,用来阻止对签名完整性的破坏,同样具备 md5 加密的几个特点。

// 使用加盐算法加密
const crytpo = require("crytpo");

let hmac = crytpo.createHmac("sha1", "panda");
let result = hmac.update("hello").digest("Base64");

console.log(result); // 7spMLxN8WJdcEtQ8Hm/LR9pUE3YsIGag9Dcai7lwioo=

crytpo.createHmac 第一个参数同 crytpo.createHash,为加密的算法,常用 sha1 和 sha256,第二个参数为密钥。

digest 方法生成的加密结果长度要大于 md5,hex 生成的结果长度为 64,Base64 生成的结果长度为 44,以 = 结尾。

安全性高于 md5,通过密钥来加密,不知道密钥无法破解,缺点是密钥传输的过程容易被劫持,可以通过一些生成随机密钥的方式避免。

2、创建密钥的方法

可以安装 openSSH 客户端,并通过命令行生成存储密钥的文件,命令如下。

openssl genrsa -out rsa_private.key 1024

openssl genrsa 代表生成密钥,-out 代表输出文件,rsa_private.key 代表文件名,1024 代表输出密钥的大小。

// 直接读取密钥文件配合加盐算法加密
const fs = require("fs");
const crytpo = require("crytpo");
const path = require("path");

let key = fs.readFileSync(path.join(__dirname, "/rsa_private.key"));
let hmac = crytpo.createHmac("sha256", key);

let result = hmac.update("hello").digest("Base64");

console.log(result); // bmi2N+6kwgwt5b+U+zSgjL/NFs+GsUnZmcieqLKBy4M=

对称性加密

对称性加密是发送数据时使用密钥和加密算法进行加密,接收数据时需要使用相同的密钥和加密算法的逆算法(解密算法)进行解密,也就是说对称性加密的过程是可逆的,crytpo 中使用的算法为 blowfish。

// 对称性加密
const fs = require("fs");
const crypto = require("crypto");
const path = require("path");

let key = fs.readFileSync(path.join(__dirname, "/rsa_private.key"));

// 加密
let cipher = crypto.createCipher("blowfish", key);
cipher.update("hello");

// final 方法不能链式调用
let result = cipher.final("hex");
console.log(result); // 3eb9943113c7aa1e

// 解密
let decipher = crypto.createDecipher("blowfish", key);
decipher.update(result, "hex");

let data = decipher.final("utf8");
console.log(data); // hello

加密使用 crypto.createCipher 方法,解密使用 crypto.createDecipher 方法,但是使用的算法和密钥必须相同,需要注意的是解密过程中 update 中需要在第二个参数中指定加密时的格式,如 hex,在 final 还原数据时需要指定加密字符的编码格式,如 utf8。

注意:使用对称性加密的字符串有长度限制,不得超过 7 个字符,否则虽然可以加密成功,但是无法解密。

缺点:密钥在传输过程中容易被截获,存在安全风险。


非对称性加密

非对称性加密相也是可逆的,较于对称性加密要更安全,消息传输方和接收方都会在本地创建一对密钥,公钥和私钥,互相将自己的公钥发送给对方,每次消息传递时使用对方的公钥加密,对方接收消息后使用他的的私钥解密,这样在公钥传递的过程中被截获也无法解密,因为公钥加密的消息只有配对的私钥可以解密。

接下来我们使用 openSSH 对之前生成的私钥 rsa_private.key 产生一个对应的公钥,命令如下。

openssl rsa -in rsa_private.key -pubout -out rsa_public.key

上面的命令意思根据一个私钥生成对应的公钥,-pubout -out 代表公钥输出,rsa_public.key 为公钥的文件名。

// 非对称性加密
const fs = require("fs");
const crypto = require("crypto");
const path = require("path");

// 获取公钥和私钥
let publicKey = fs.readFileSync(path.join(__dirname, "/rsa_public.key"));
let privateKey = fs.readFileSync(path.join(__dirname, "/rsa_private.key"));

// 加密
let secret = crytpo.publicEncrypt(publicKey, Buffer.from("hello"));

// 解密
let result = crytpo.provateDecrypt(privateKey, secret);

console.log(result); // hello

使用公钥加密的方法是 crytpo.publicEncrypt,第一个参数为公钥,第二个参数为加密信息(必须是 Buffer),使用私钥解密的方法是 crytpo.provateDecrypt,第一个参数为私钥,第二个参数为解密的信息。


签名

签名与非对称性加密非常类似,同样有公钥和私钥,不同的是使用私钥加密,对方使用公钥进行解密验证,以确保这段数据是私钥的拥有者所发出的原始数据,且在网络中的传输过程中未被修改。

在这里插入图片描述

我们还使用 rsa_public.key 和 rsa_private.key 作为公钥和私钥,crypto 实现签名代码如下。

// 签名
const fs = require("fs");
const crypto = require("crypto");
const path = require("path");

// 获取公钥和私钥
let publicKey = fs.readFileSync(path.join(__dirname, "rsa_public.key"), "ascii");
let privateKey = fs.readFileSync(path.join(__dirname, "rsa_private.key"), "ascii");

// 生成签名
let sign = crypto.createSign("RSA-SHA256");
sign.update("panda");
let signed = sign.sign(privateKey, "hex");

// 验证签名
let verify = crypto.createVerify("RSA-SHA256");
verify.update("panda");
let verifyResult = verify.verify(publicKey, signed, "hex");

console.log(verifyResult); // true

生成签名的 sign 方法有两个参数,第一个参数为私钥,第二个参数为生成签名的格式,最后返回的 signed 为生成的签名(字符串)。

验证签名的 verify 方法有三个参数,第一个参数为公钥,第二个参数为被验证的签名,第三个参数为生成签名时的格式,返回为布尔值,即是否通过验证。

使用场景:经常用于对 cookie 签名返回浏览器,当浏览器访问同域服务器将 cookie 带过来时再进行验证,防止 cookie 被篡改和 CSRF 跨站请求伪造。


总结

各种项目在数据传输时根据信息的敏感度以及用途进行不同的加密算法和加密方式,在 NodeJS 中,crypto 的 API 完全可以实现我们的加密需求,也可以将上面的加密方案组合使用实现更复杂的加密方案。


nodejs加密模块crypto nodejs加密模块crypto 前言:nodejs加密模块,对数据进行加密。做了一个关于钱的项目就各种加密,研究了一下还是遇到不少坑,所以记录下来以免重复踩坑。 crypto的官网API地址:https://nodejs.org/api/crypto.html,API记录很全,这里记录一些坑。 一 .记录几个比较常用的加密方法 1 crypto.getHashes 阅读详情

相关推荐

Node.js 数据加密传输浅析

主要给大家介绍的是Node.js数据加密传输,本文主要介绍的是明文传输,文中通过示例代码介绍的很详细,相信对于大家的理解和学习会很有帮助,有需要的朋友们下面来一起学习学习吧。

基于NodeJS的HTTP server Plus 6:加密(crypto)

加密简介加密是以某种算法改变原有的信息数据,使得未授权用户即使获得了已加密信息,因不知解密的方法,无法得知信息真正的含义,通过这种方式提高网络数据传输的安全性,加密算法常见的有哈希算法、HMAC 算法、签名、对称性加密算法和非对称性加密算法,加密算法也分为可逆和不可逆,比如 md5 就是不可逆加密,只能暴力破解(撞库),我们在 NodeJS 开发中就是直接使用这些加密算法,crypto 模块提供了...

weixin_34111790的博客 331

GAMIT/GLOBK 10.71在Linux环境下的GNSS数据处理全流程解析(附实战案例)

本文详细解析了在Linux环境下部署和运行GAMIT/GLOBK 10.71进行GNSS数据处理的完整流程。从系统环境配置、软件编译安装、关键表格文件更新,到运行自带示例和实战案例,提供了清晰的步骤与避坑指南,帮助用户掌握这一高精度GNSS数据处理工具的核心使用方法。

kmeans3miner的博客 310

nodejs之JSEncrypt模块,浏览器端非对称加密RSA算法库

JSEncrypt 是一个用于在浏览器中进行RSA加密和解密的 JavaScript 库。它提供了一种简单的方式来生成 RSA 密钥对、加密数据并使用私钥解密数据。生成密钥对:使用 JSEncrypt,你可以轻松地生成 RSA 密钥对。你可以通过调用 new JSEncrypt() 创建一个 JSEncrypt 实例,然后使用 getKey() 方法生成密钥对。生成的密钥对包括公钥和私钥。加密数据:一旦你有了密钥对,你可以使用公钥对数据进行加密。

老衲爱洗头的博客 1万+

全球第一开源云ERP Odoo操作手册 模块安装和界面汉化指南

Odoo 的功能包含在不同的模块中, 刚创建的数据库除 Odoo 的核心模块外, 其它模块并没有被安装到系统中,你可以根据需要安装它们。本节将介绍安装模块和界面汉化的相关知识。

weixin_44793763的博客 2073

香橙派OPi 6系列选型指南:RK3588与RK3588S开发板深度对比

开发板选型是嵌入式系统设计的关键环节,尤其在边缘计算和AI推理等场景中,芯片的差异直接影响硬件架构。瑞芯微RK3588及其精简版RK3588S是当前高端开发板的核心方案,两者在PCIe通道、显示输出和SATA支持上存在显著区别。理解这些原理,有助于工程师根据项目需求快速匹配产品。香橙派OPi 6系列基于这两款芯片,衍生出OPi 6、OPi 6 Pro与OPi 6 Max三种形态:紧凑型适合嵌入式门禁与AI盒子,Pro版凭借双屏异显和PCIe 3.0满足收银机与视频分析,Max的双2.5G网口和大内存则面向轻

weixin_29185167的博客 227

Windows11安装node.js——npm安装crypto-js库——实战某网址获取加密解密算法

使用加密的场景有很多,我这里只讲述了URL地址加密的场景,简单总结下:第一步:安装crypto-js第二步:引入crypto-js第三步:封装工具类(当然也可以直接使用)第四步:调用工具类第五步:使用方法转码,然后拼接当然,这个是最基础的用法,想深入可查看官方文档!除了实战是自己写的外,其余都是选取以下链接:至于为何选取,原因充当笔记windows11安装nodejs详解_win11安装nodejs-优快云博客加密解密之 crypto-js 知识-优快云博客。

weixin_44646671的博客 1万+

PDPS16.0单机版与SPLMLicenseServer授权避坑指南:从安装到冲突解决

本文详细解析了PDPS16.0单机版的安装与授权流程,重点阐述了如何正确配置SPLMLicenseServer本地许可证服务器以实现软件激活。针对安装过程中常见的许可证冲突问题,提供了清晰的排查思路和解决方案,并介绍了通过设置环境变量等替代授权方法,帮助用户高效避坑,确保Tecnomatix Process Simulate顺利运行。

weixin_29231221的博客 564

NodeJS加密算法

当发送方A向接收方B发送数据时,需要考虑的问题有:数据的安全性。数据的完整性,即数据不被篡改。数据的真实性,即数据确实来自于发送方,传输过程中没有被替换。数据的不可否认性,即验证发送方确实发送了数据。A 使用密钥加密数据A 将密文发送给 BB 收到密文后,使用相同的密钥对其进行解密,取得原始数据优点:速度快缺点:密钥被盗就被破解、密钥管理不方便(每个用户都要对应一个密钥)实现算法有:凯撒密码,AES(Advanced Encryption Standard)、DES(Data Encryption Stan

过客2019 4126

【嵌入式DIY实例-Arduino篇】-脉搏传感器监测脉搏率 (BPM)及可视化

在本文中,我们将使用 Arduino 和脉搏传感器来测量心率 (BPM)。 在文章中,我们将向展示如何使用脉搏传感器测量您的心率(每分钟心跳次数),并在电脑上位机通过Processing来实现心率数据可视化。同时使用LCD16×2 显示屏显示脉搏率 BPM。 该传感器易于使用和操作。 只需将手指放在传感器顶部,它就会测量心跳变化。

视觉与物联智能 834

【大模型】DeepSeek 高级提示词技巧使用详解

DeepSeek 高级提示词技巧使用详解

congge 1万+

node 加密解密模块_NodeJS之crypto模块公钥加密及解密

NodeJS有以下4个与公钥加密相关的类。Cipher: 用于加密数据;Decipher: 用于解密数据;Sign: 用于生成签名;Verify: 用于验证签名;在使用公钥加密技术时,需要使用公钥及私钥:公钥是用于创建只有私钥的拥有者能够读出的加密数据,以及对私钥的拥有者的签名进行验证;私钥是用于解密数据以及对数据进行签名。一、加密数据在crypto模块中,Cipher类用于对数据进行加密操作;我...

weixin_36255898的博客 885

车辆网络安全ISO/SAE 21434解读(一)概述

ISO/SAE 21434 《道路车辆 网络安全工程》是SAE和ISO共同制定的一项针对道路车辆的网络安全标准,它是一个面向汽车行业全供应链(OEM及各级供应商)的车辆网络安全管理指导文件

xiaoxiabang的博客 8426

nodeJS之crypto模块md5和Hmac加密

nodeJS之crypto模块md5和Hmac加密 原文地址:https://www.cnblogs.com/tugenhua0707/p/9128690.html 在nodejs中,可以使用crypto模块来实现各种不同的加密与解密处理,在crypto模块中包含了类似MD5或SHA-1这些散列算法,我们可以通过crypto模块来实现HMAC运算。什么是HMAC运算?HMAC的中文意思...

weixin_33897722的博客 625

开源遥感语义分割工具箱mmsegmentation基于Lovedata数据集训练模型

开源遥感语义分割工具箱mmsegmentation基于Lovedata数据集训练模型

yilvyangguang520的博客 498

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

nodejs crypto 加密模块分析及ASE加密、解密的实现

crypto 加密模块 crypto 模块提供了加密功能,包括对OpenSSL 的哈希、HMAC、加密、解密、签名、以及验证功能的以整套封装。 使用 require('crypto') 来访问该模块 查看nodejs支持的加密算法, 使用 crypto.getCiphers(),如下所示 const crypto = require('crypto') crypto.get...

weixin_43379230的博客 2527

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

使用nodejs crypto模块进行sha1、md5加密

文档地址:http://nodejs.cn/api/crypto.html 使用crypto.createHash(algorithm [,options])这个方法,该创建并返回一个Hash对象,该对象可用于使用给定的哈希摘要生成哈希摘要algorithm。其中algorithm取决于平台上OpenSSL版本支持的可用算法。不只支持sha1和md5这两种,还支持sha256、 const {cr...

weixin_33739523的博客 3456

nodejs - 内置模块crypto:多种加密功能

Node.js的crypto模块提供了丰富的加密功能,包括哈希计算(如SHA-256、MD5)、对称加密(AES)、非对称加密(RSA)、HMAC认证以及随机数生成等。通过引入require("crypto")即可使用这些功能,适用于密码存储、数据加密传输等安全场景。模块支持密钥对生成、加密解密操作,并提供randomBytes方法生成安全随机数。典型应用包括使用盐值哈希存储密码、验证用户输入等,是处理敏感数据的核心工具。

尽日寻春不见春,芒鞋踏遍陇头云。归来笑拈梅花嗅,春在枝头已十分。 1162

nodejs中的加密模块 crypto 模块

nodejs中的加密模块 crypto 模块

LeeKwen的专栏 3896

<nodejs>crypto模块MD5加密

<nodejs>crypto模块MD5加密

Machangzhi_1115的博客 1347

nodejs之Crypto模块实现加密

参考:http://cnodejs.org/topic/56e22b279386fbf86ddd69ce参考二:http://cnodejs.org/topic/504061d7fef591855112bab5参考三:https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/0014345...

代码解释生活 5081
上一篇: NodeJS 服务器实现 gzip 压缩
下一篇: HTTP 缓存的那些事儿
Panda Shen
博客等级 码龄10年 18粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值