Node之加密与解密处理

2023-10-27

crypto模块概述

在Node.js中,使用OpenSSL类库作为其内部实现加密与解密处理的基础手段,这是因为目前OpenSSL已经成为了一个经过严格测试的可靠的加密与解密算法的实现工具。

在Node.js中,OpenSSL类库被封装在crypto模块中,因此开发者可以使用crypto模块来实现各种不同的加密与解密处理。例如,crypto模块中包含了类似MD5或SHA-1之类的散列算法。开发者也可以通过crypto模块来实现HMAC运算 [1]。在crypto模块中,提供了一些加密方法来实现数据的可靠加密。另外,在crypto模块中,也提供了一些利用HMAC运算来实现数字签名以及对数字签名进行验证的方
法。

查看Node.js中能够使用的所有加密算法

在crypto模块中,为每一种加密算法定义了一个类。可以使用getCiphers方法
来查看Node.js中能够使用的所有加密算法。

crypto.getCiphers()

查看Node.js中能够使用的所有散列算法

可以使用getHashes方法来查看在Node.js中能够使用的所有散列算法。

crypto.getHashes()

散列算法

散列(哈希)算法用来实现一些重要处理,例如,在允许对一段数据进行验证的前提下,将数据进行模糊化,或者为一大段数据提供一个验证码

在node中,为了使用散列算法,首先应该使用createHash方法创建一个hash对象。

let hash=crypto.createHash(algorithm)
  • algorithm:参数值为一个在Node.js中可以使用的算法,如’sha1’、‘md5’、‘sha256’、'sha512’和’ripemd160’等,用于指定需要使用的散列算法,该方法返回被创建的hash对象

在创建一个hash对象后可以通过使用该对象的update方法创建一个摘要。该方法的使用方式如下所示

hash.update(data,[input_encoding])
  • data:参数值为一个Buffer对象或一个字符串,用于指定摘要内容
  • input_encoding:用于指定摘要内容所需使用的编码格式,可指定参数值为“utf8”、“ascii”或“binary”。如果不使用input_encoding参数,则data参数值必须为一个Buffer对象。可以在摘要被输出前使用多次update方法来添加摘要内容。
输出摘要内容

可以使用hash对象的digest方法来输出摘要内容。在使用了hash对象的digest方法后,不能再向hash对象中追加摘要内容。

hash.digest([encoding])

在hash对象的digest方法中,使用一个可选参数,参数值为一个字符串,用于指定输出摘要的编码格式,可指定参数值为“hex”、“binary”及“base64”。如果使用了该参数,那么digest方法返回字符串格式的摘要内容,如果不使用该参数,那么digest方法返回一个Buffer对象。在hash对象的digest方法被调用之后,该对象不能再被使用。

散列算法完整使用示例
var crypto = require('crypto');
var fs = require('fs');
var shasum = crypto.createHash('sha1');
var s = fs.ReadStream('./app.js');
s.on('data', function(d) {
    shasum.update(d);
});
s.on('end', function() {
    var d = shasum.digest('hex');
    console.log(d);
});

HMAC算法

HMAC算法将散列算法与一个密钥结合在一起,以阻止对签名完整性的破坏。在Node.js中,为了使用HMAC算法,首先应该使用createHmac方法创建一个hmac对象。

crypto.createHmac(algorithm,key)
  • algorithm:为一个在Node.js中可以使用的算法,例如’sha1’、‘md5’、‘sha256’、'sha512’和’ripemd160’等,用于指定我们所需要使用的散列算法。该方法返回被创建的hmac对象。
  • key:参数值为一个字符串,用于指定一个PEM格式的密钥。
创建一个摘要

在hmac对象的update方法中,使用一个参数,其参数值为一个Buffer对象或一个字符串,用于指定摘要内容。可以在摘要被输出前使用多次update方法来添加摘要内容。

hmac.update(data)
输出摘要

可以使用hmac对象的digest方法输出摘要内容。在使用了hmac对象的digest方法后,不能再向hmac对象中追加摘要内容。

hmac.digest([encoding])
HMAC算法的使用示例
var crypto = require('crypto');
var fs = require('fs');
var pem = fs.readFileSync('key.pem');
var key = pem.toString('ascii');
var shasum = crypto.createHmac('sha1',key);
var s = fs.ReadStream('./app.js');
s.on('data', function(d) {
    shasum.update(d);
});
s.on('end', function() {
    var d = shasum.digest('hex');
    console.log(d);
});

公钥加密

加密数据

在crypto模块中,Cipher类用于对数据进行加密操作。在加密数据之前,首先需要创建一个cipher对象。可以通过如下所示的两种方法创建cipher对象。
1.createCipher方法:该方法使用指定的算法与密码来创建cipher对象。

crypto.createCipher(algorithm,password)
  • algorithm:用于指定在加密数据时所使用的算法,例如“blowfish’”、“aes-256-cbc”等。
  • password:用于指定加密时所使用的密码,参数值必须为一个二进制格式的字符串或一个Buffer对象。

2.createCipheriv方法:该方法使用指定的算法、密码与初始向量(Initialization Vector,IV)来创建cipher对象。该方法的使用方式如下:

crypto.createCipheriv(algorithm,password,iv)
  • algorithm:用于指定在加密数据时所使用的算法,例如“blowfish’”、“aes-256-cbc”等。
  • password:用于指定加密时所使用的密码,参数值必须为一个二进制格式的字符串或一个Buffer对象。
  • iv:用于指定加密时所使用的初始向量,参数值必须为一个二进制格式的字符串或一个Buffer对象。
指定需要被加密的数据。

在创建了一个cipher对象后,可以通过使用该对象的update方法来指定需要被加密的数据。

cipher.update(data,[input_encoding],[output_encoding])
  • data:为必须使用的参数,为一个Buffer对象或一个字符串,用于指定需要加密的数据
  • input_encoding:用于指定被加密的数据所需使用的编码格式,可指定参数值为“utf8”、“ascii”及“binary”。
  • output_encoding:用于指定输出加密数据时使用的编码格式,可指定参数值为“hex”、“binary”或“base64”。
返回加密数据。

可以使用cipher对象的final方法来返回加密数据。当该方法被调用时,任何cipher对象中所缓存的数据都将被加密,如果加密数据的字节数不足以创建一个块,将使用PKCS填充方式来填充这个块。在使用了cipher对象的final方法后,不能再向cipher对象中追加加密数据。

cipher.final([output_encoding])
  • output_encoding:参数值为一个字符串,用于指定在输出加密数据的编码格式,可指定参数值为“hex”、“binary”及“base64”。如果使用了该参数,那么final方法返回字符串格式的加密数据,如果不使用该参数,那么final方法返回一个Buffer对象。当cipher对象的final方法被调用之后,该对象不能再被使用。
使用cipher对象加密数据
var crypto = require('crypto');
var fs = require('fs');
var pem = fs.readFileSync('key.pem');
var key = pem.toString('ascii');
var cipher = crypto.createCipher('blowfish', key);
var text = "test";
cipher.update(text,'binary','hex');
var crypted=cipher.final('hex')
console.log(crypted);

解密数据

在crypto模块中,Decipher类用于对加密后的数据进行解密操作。在解密数据之前,首先需要创建一个decipher对象。可以通过如下所示的两种方法创建decipher对象。

1.createDecipher方法:该方法使用指定的算法与密码来创建decipher对象。

crypto.createDecipher(algorithm,password)
  • algorithm:用于指定在解密数据时所使用的算法,例如“blowfish”、“aes-256-cbc”等,该算法必须与加密该数据时所使用的算法保持一致。
  • password:用于指定解密时所使用的密码,其参数值必须为一个二进制格式的字符串或一个Buffer对象,该密码必须与加
    密该数据时所使用的密码保持一致。

2.createDecipheriv方法:该方法使用指定的算法、密码与初始向量来创建decipher对象。

crypto.createDecipheriv(algorithm,password,iv)
  • algorithm:用于指定在解密数据时所使用的算法,例如“blowfish”、“aes-256-cbc”等,该算法必须与加密该数据时所使用的算法保持一致。
  • password:用于指定解密时所使用的密码,其参数值必须为一个二进制格式的字符串或一个Buffer对象,该密码必须与加
    密该数据时所使用的密码保持一致。
  • iv:用于指定解密时所使用的初始向量,参数值必须为一个二进制格式的字符串或一个Buffer对象,该初始向量必须与加密该数据时所使用的初始向量保持一致。

createDecipheriv方法返回一个被创建的decipher对象。

数据解密

在创建了一个decipher对象之后,可以通过使用该对象的update方法来指定需要被解密的数据。

decipher.update(data,[input_encoding],[output_encoding])
返回经过解密之后的原始数据
decipher.final([output_encoding])

创建签名

在网络中,私钥的拥有者可以在一段数据被发送之前先对该数据进行签名操作,在签名的过程中,将对这段数据执行加密处理。在经过加密后的数据发送之后,数据的接收者可以通过公钥的使用来对该签名进行解密及验证操作,以确保这段数据是私钥的拥有者所发出的原始数据,且在网络的传输过程中未被修改。

在Node.js中,在进行签名操作之前,首先需要使用createSign方法创建一个sign对象

crypto.createSign(algorithm)
  • algorithm:指定加密算法

createSign方法返回被创建的sign对象。

指定加密数据

在创建了一个sign对象后,可以通过使用该对象的update方法来指定需要被加密的数据。

sign.update(data)

在sign对象的update方法中,使用一个参数,其参数值为一个Buffer对象或一个字符串,用于指定需要被加密的数据。可以在对数据进行签名前使用多次update方法来添加数据。

对数据进行签名

可以使用sign对象的sign方法对数据进行签名。在使用了sign对象的sign方法之后,不能再使用sign对象的update方法追加数据。

sign.sign(private_key,[output_format])
  • private_key:为一个字符串,用于指定PEM格式的私钥。
  • output_format:用于指定签名输出时所使用的编码格式,可指定参数值为“hex”、“binary”或“base64”。

签名验证

在crypto模块中,Verify类用于对签名进行验证操作。在对签名进行验证之前,首先需要创建一个verify对象,可以通过createVerify方法创建verify对象

crypto.createVerify(algorithm)
  • algorithm:用于指定在验证签名数据时所使用的算法

createVerify方法返回一个被创建的verify对象。

指定需要被验证的数据
verify.update(data)

可以使用verify对象的verify方法来对签名进行验证。

verify.verify(object,signature,[signature_format])
  • object:用于指定验证时所使用的对象,参数值为一个字符串,该字符串值可以为一个RSA公钥、一个DSA公钥或一个X.509证书。
  • signature:必须为sign对象,用于指定被验证的签名。
  • signature_format:用于指定在生成该签名时所使用的编码格式,可指定参数值为“hex”、“binary”及“base64”。
使用verify对象对签名进行验证
var crypto = require('crypto');
var fs = require('fs');
var privatePem = fs.readFileSync('key.pem');
var publicPem = fs.readFileSync('cert.pem');
var key = privatePem.toString();
var pubkey = publicPem.toString();
var data = "test"
var sign = crypto.createSign('RSA-SHA256');
sign.update(data);
var sig = sign.sign(key, 'hex');
var verify = crypto.createVerify('RSA-SHA256');
verify.update(data);
console.log(verify.verify(pubkey, sig, 'hex'));

压缩与解压缩处理

在Node.js中,可以使用zlib模块进行压缩及解压缩处理,在该模块内部使用zlib类库实现这些处理。具体不做描述,可见node官方文档

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node之加密与解密处理 的相关文章

随机推荐

  • 花生壳实现内网穿透,获取公网IP?花生壳端口映射外网TCP测试

    什么是内网穿透 内网穿透即NAT穿透 内网穿透可以让你局域网中的电脑实现外网访问功能 例如我公司电脑上运行了一个linux虚拟主机 安装SSH服务后我就可以在整个局域网内 连接192 168 xx xx去操作这台linux主机 但这只局限于
  • Python_Socket_接送来自客户端的数据出现乱码

    最新在学python 问题有很多 但过程还算美好 有问题都及时解决了 下面附上碰到的用网络调试助手发送中文 服务端接收乱码解决思路 这个网络调试助手的默认编码格式应该是gbk 所以解码的时候用格式用gbk 下面是服务端接收信息的代码 imp
  • Redis基础及与springboot整合

    安装redis 下载redis 百度就有 上传到centos linux下安装gcc环境 yum install gcc 解压redis安装包 tar zxvf redis xxx xx tar 编译和安装解压好的redis cd stud
  • Centos8安装MySQL

    受苦于博客总是过于老旧 安装时总会出现版本包已经删除的情况而且步骤总是各式各样难以理解 无奈之下还是官网靠谱 于是这篇博客以官网方法为基准 方便以后安装的时候可以直接复制命令 一 官网教程 https dev mysql com doc r
  • STM32毕业设计选题汇总

    文章目录 1前言 2 STM32 毕设课题 3 如何选题 3 1 不要给自己挖坑 3 2 难度把控 3 3 如何命名题目 1前言 更新单片机嵌入式选题后 不少学弟学妹催学长更新STM32和C51选题系列 感谢大家的认可 来啦 以下是学长亲手
  • python通过docker打包执行

    背景 正常情况下 python脚本执行需要安装有python环境 那python环境虽然也可以通过移植的方法来安装 那总归是比较麻烦的 下面通过docker打包的方式来执行python脚本 1 安装python镜像 准备两个文件即可 doc
  • 前端LayUI框架快速上手实现登入注册

    目录 一 Layui简介 1 什么是LayUI 2 LayUI的特点 二 LayUI入门 1 LayUI下载 2 LayUI入门使用 2 1 在web项目中导入LayUI文件中的layui文件 2 2 在JSP页面引入css js文件 2
  • linux建立虚拟内存,如何在Linux环境下建立虚拟内存

    虚拟内存是将硬盘规划出一个区间用来读取数据的空间 但是有很多用户们都不知道Linux环境下如何建立虚拟内存 那么现在我们就一起跟小编去看看具体内容吧 在Linux 下就是建立swap file 基本步骤 先建立swap这个装置或是档案后 将
  • Java程序员到架构师的推荐阅读书籍

    Java程序员到架构师的推荐阅读书籍 作为Java程序员来说 最痛苦的事情莫过于可以选择的范围太广 可以读的书太多 往往容易无所适从 我想就我自己读过的技术书籍中挑选出来一些 按照学习的先后顺序 推荐给大家 特别是那些想不断提高自己技术水平
  • Python文件读写

    Python的文件操作函数 open filename mode 文件打开模式 执行操作 r 以只读方式打开 默认 w 以写入的方式打开文件 会覆盖已经存在的文件 x 如果指定文件已经存在 使用此模式打开将引发异常 a 以写入模式打开 如果
  • 分治法求解汉诺塔问题

    汉诺塔问题简介 汉诺塔 又称河内塔 问题是源于印度一个古老传说的益智玩具 大梵天创造世界的时候做了三根金刚石柱子 在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘 大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上 并且规定
  • GD32E230使用J-LINK下载调试问题

    1 无法识别到GD32的芯片 j link的版本要V9的才行 也就是下图的HW版本V9 4 之前是V7一直无法识别 换成V9的j link之后就可以了 2 打开J link的setting时弹出盗版警告 Warning the connec
  • Dialog居中显示

    最新使用Dialog时 发现在以下低版本系统中会出现Dialog弹窗在左上角显示的情况 搜索了一下 发现了这个方法 记录一下 dialog 居中显示 Window window dialog getWindow if dialog null
  • C++中私有变量的值想怎么改就怎么改

    这应该算是C 的一个不足吧 C 是优秀的编程语言 但不是完美的 include
  • Mybatis-plus中,如何提前获取实体类用雪花算法生成的ID?

    Mybatis plus中 通过设置 TableId可以让Mybatis plus自动为我们生成雪花算法的ID号 该ID号是一个长整型数据 非常方便 但是雪花算法的ID号是在Insert执行的时候生成的 我们在Insert执行前是不知道En
  • 论文期刊分类学习记录

    SCI主要偏重理论性研究 EI偏工程应用 SCI源刊 gt SCI会议 gt EI源刊 影响因子较好 gt 既是中文核心又是EI源刊的期刊 gt EI源刊 影响因子一般 gt EI会议 权威会议 gt 中文核心期刊 南大核心 CSCS gt
  • SQL开窗函数(窗口函数)详解

    一 什么是开窗函数 开窗函数 分析函数 over 开窗函数也叫分析函数 有两类 一类是聚合开窗函数 一类是排序开窗函数 开窗函数的调用格式为 函数名 列名 OVER partition by 列名 order by列名 如果你没听说过开窗函
  • java8 list根据实体单字段、多字段分组。去重

    Map
  • boost静态链接库和c++/clr不兼容问题:未能加载文件或程序集,不是有效的Win32应用程序。

    项目上遇到的问题 c 编写的类使用托管c 包装成dll提供给c 项目使用 c 需要使用boost clr 项目目标平台都是win32 x86 开发环境win10 x64系统 vs2013 Net Framework 4 0 boost 1
  • Node之加密与解密处理

    crypto模块概述 在Node js中 使用OpenSSL类库作为其内部实现加密与解密处理的基础手段 这是因为目前OpenSSL已经成为了一个经过严格测试的可靠的加密与解密算法的实现工具 在Node js中 OpenSSL类库被封装在cr