【js逆向基础】crypto 之 hash和hmac

news2025/1/6 19:34:38

▒ 目录 ▒

    • 🛫 导读
      • 需求
      • 开发环境
    • 1️⃣ hash
      • 对象创建Hash
      • 常见方法
      • 例封装成 stream 实例
      • 封装成管道流(piped stream)
    • 2️⃣ hmac
      • 对象创建Hmac
      • 常见方法
      • 例封装成 stream 实例
      • 封装成管道流(piped stream)
    • 🛬 文章小结
    • 📖 参考资料

🛫 导读

需求

说到安全,就不得不说,加密与解密,今天要说的是nodejs原生加密库crypto(不是crypto-js)。

crypto 模块需要node 所运行的运行支持OpenSSL,该模块为使用安全证书实现HTTPS 安全网络以及HTTP 连接提供了支持。 模块同样为OpenSSL 的hashhmac、cipher、decipher、sign 以及verify 方法提供一层包装(以方便在Node 中 使用)。

开发环境

版本号描述
文章日期2022-12-12

1️⃣ hash

对象创建Hash

crypto.createHash(algorithm)
该方法用于创建和返回一个 Hash 对象,该对象可以使用指定 algorithm 生成哈希摘要。
algorithm 参数的值受限于当前平台 OpenSLL 所支持的算法,比如 sha256sha512 等。在最新的 OpneSSL 版本中,使用 openssl list-cipher-algorithms 命令可以显示所有可用的摘要算法。

常见方法

hash.update(data[, input_encoding])
该方法根据 data 参数更新哈希后的数据,可选参数 input_encoding 指定的编码格式必须为 utf8、ascii 或 binary 之一。
如果没有指定 encoding 参数,且 data 为字符串数据,则强制使用 binary 编码格式。如果 data 是一个 Buffer 实例,则会自动忽略 input_encoding 参数的值。

当数据被包装成 stream 实例之后,该方法可以调用多次。

hash.digest([encoding])
该方法用于计算原始数据的哈希摘要。encoding 参数的值必须为 hexbinarybase64 其中的一个。如果指定了有效的 encoding 参数,则该方法返回一个字符串,否则返回一个 Buffer 实例。
在 hash.digest() 方法执行之后,不能再重复调用 Hash 对象,多次调用该方法将会抛出错误。

例封装成 stream 实例

可以比对在线网站查看hash值进行结果确认:6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50
在这里插入图片描述

const crypto = require('crypto');
const hash = crypto.createHash('sha256');
hash.on('readable', () => {
  var data = hash.read();
  if (data)
    console.log(data.toString('hex'));
    // Prints:
    //   6a2da20943931e9834fc12cfe5bb47bbd9ae43489a30726962b576f4e3993e50
});
hash.write('some data to hash');
hash.end();

封装成管道流(piped stream)

const crypto = require('crypto');
const fs = require('fs');
const hash = crypto.createHash('sha256');
const input = fs.createReadStream('test.js');
input.pipe(hash).pipe(process.stdout);

2️⃣ hmac

对象创建Hmac

crypto.createHmac(algorithm, key)
该方法根据传入的 algorithm 和 key 创建和返回一个 Hmac 对象。
algorithm 参数的值受限于当前平台 OpenSLL 所支持的算法,比如 sha256sha512 等。在最新的 OpneSSL 版本中,使用 openssl list-cipher-algorithms 命令可以显示所有可用的摘要算法。
这里的参数 key 是 HMAC 用于生成加密 HMAC 哈希的密钥。

常见方法

跟Hash一样的。

例封装成 stream 实例

可以比对在线网站查看hash值进行结果确认:7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e
在这里插入图片描述

const crypto = require('crypto');
const hmac = crypto.createHmac('sha256', 'a secret');
hmac.on('readable', () => {
  var data = hmac.read();
  if (data)
    console.log(data.toString('hex'));
    // Prints:
    //   7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e
});
hmac.write('some data to hash');
hmac.end();

封装成管道流(piped stream)

const crypto = require('crypto');
const fs = require('fs');
const hmac = crypto.createHmac('sha256', 'a secret');
const input = fs.createReadStream('test.js');
input.pipe(hmac).pipe(process.stdout);

🛬 文章小结

hash和hmac都属于散列算法,hmac可以理解为带密码的hash

使用场景:

  • 文件对比:验证两个文件是否一致,通过MD5算法计算MD5值,看两个文件是否一致,如果一致证明同一个文件(高效、唯一特性)。
  • 登录口令:注册、登录功能,不会直接将用户密码明文入库,一般采用hash(口令+salt)算出摘要值入库,登录的时候也通过hash方式去匹配。

MAC (Message Authentication Code)
MD5(MD5 Message-Digest Algorithm)
SHA1(Secure Hash Algorithm 1)
SHA2(Secure Hash Algorithm 2)
SHA3(Secure Hash Algorithm 3)

📖 参考资料

  • 官网文档-英文的:https://nodejs.org/docs/latest-v13.x/api/crypto.html
  • Node.js 5.x 中文文档 https://www.bookstack.cn/read/node-doc-5.x/doc-crypto.md
  • Node.js技术栈 https://www.bookstack.cn/read/Nodejs-Roadmap/nodejs-crypto.md
  • 在线hash https://www.sojson.com/hash.html
  • 加密算法简单了解——HASH、MAC及一些加密模式 https://blog.csdn.net/weixin_42040046/article/details/118084576

**ps:**文章中内容仅用于技术交流,请勿用于违规违法行为。

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

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

相关文章

mysql学习---流程控制函数(条件判断)case when ,if使用

文章目录流程控制函数流程控制函数的介绍流程函数的使用流程控制函数 流程控制函数的介绍 if(value,value1,value2) 解释:如果value的结果为true ,返回value1,否则返回value2 例如: select if(1>0,正确,错误) ->正确ifnull(value1,val…

Babel快速入门

一、简介 Babel是一个广泛使用的转码器,可以将ES6代码转为ES5代码,从而在现有环境执行执行。 这意味着,你可以现在就用 ES6 编写程序,而不用担心现有环境是否支持。 二、安装 安装命令行转码工具 Babel提供babel-cli工具&#xff…

Mysql调优(三)——通过索引进行优化、 查询优化

接上:Mysql调优(二)——schema与数据类型优化、执行计划 本篇文章在一定程度上与下面两篇文章重合,笔者建议优先读下面两篇文章,本文偏向概念,而它们偏向原理: Mysql索引的本质深入浅出&#x…

全栈Jmeter接口测试(五):json提取器元件及jsonpath介绍,响应断言元件

Jmeter(10):json提取器元件及jsonpath介绍 json提取器元件介绍: json提取器与正则表达式提取器功能类似,也是用来截取响应信息的部分保 存到指定的变量中去,不同的是,它只能用来处理响应正文,并且响应正文…

ITE Super IO 学习 – 串口

串口都算是一个比较古老的功能了,也就是比较成熟了。Super IO中的大部分是硬件已经做好的,BIOS这边只需做小小的改动甚至默认便可以工作了。 串口寄存器 串口有关的寄存器总的来说有4个,两个用来设置IO资源的地址,一个是中断号选择,还有一个特殊配置寄存器。 Seri…

高级路由期末命令配置

文章目录前提要求(1)拓扑图搭建及IP地址规划拓扑图配置:IP地址表规划表1网络连接规划表表2 网络设备明细表表3 IP规划表(2)OSPF(3)BGP(4)路由引入(5)路由选择&#xff08…

PicoDet代码学习记录

推理步骤 [picodet_s_320_coco.yml] Infer.py main()->run()Trainer.py __init__() self.model create(cfg.architecture) Picodet.py from_config()->__init__() head create(cfg[head], **kwargs)时候调用: Layers.py MultiClassNMS __…

Django(一)

一、Django介绍 1、python语言编写的开源web框架 2、重量级python web框架,配备了常用的大部分组件 3、组件: ※基本配置文件/路由系统 ※模型层(M)/模板层(T)/视图层(V) ※co…

Cadence创建插件焊盘(超详细)

背景:Cadence画封装,在我看来,操作是比较不方便的事儿,所以在此在记录一遍。要画一个插件封装,需要调用画好的焊盘(AD里直接设置即可),另外放置好pin的位置和绘制好边框。包括遇到的…

SpringBoot集成阿里EasyExcel导出excel高级实战

目录参考一、引入包二、导出到文件并输出到后台三、过滤字段方式1:类上加注解 ExcelIgnoreUnannotated,过滤属性没有ExcelProperty注解的字段方式2:指定字段加注解方式3:代码指定过滤字段, 同一个excel生成两个sheet分别过滤不同字…

clickhouse集群搭建

一、clickhouse单机部署 clickhouse镜像下载地址 https://mirrors.tuna.tsinghua.edu.cn/clickhouse/ 1、关闭防火墙 #查看防火墙状态systemctl status firewalld#关闭防火墙systemctl stop firewalld#设置防火墙服务开机不自启systemctl disable firewalld#再次查看防火墙检…

开源软件如何使企业和业务受益

在当今技术驱动、快速发展的商业环境中,越来越多的公司选择投资开源软件。开源为企业提供了许多优势:更快的创新步伐、来自庞大而热情的社区的强大支持以及不受供应商锁定的影响。 对于许多人来说,开源不仅仅是编码。它代表了一种生活方式。…

使用IDEA工具,通过Java API 操作 HDFS (文件/目录的操作,含源码,详细操作步骤)

文章目录一,了解 HDFS Java API(一)HDFS常见类与接口(二)FileSystem的常用方法二,编写Java程序访问HDFS01 创建Maven项目02 添加相关依赖03 创建日志属性文件(1)在resources目录里创…

2022年还剩半个月,我从外包公司离职了...

今天是12.12,距离元旦也仅剩半个月,大家都在考论假期怎么过,没错,我离职了... 19年大专毕业通过校招进入了一家外包公司,干了接近3年的功能测试,今年年初,感觉自己不能够在这样下去了&#xff…

MyBatis 注解开发

文章目录一、单表查询1. Select 注解2. Insert 注解3. Update 注解4. Delete 注解5. Param 注解二、多表关联查询1. 一对一查询2. 一对多查询3. 多对多查询一、单表查询 1. Select 注解 前面的章节介绍了 MyBatis 的基本用法、关联映射、动态 SQL 和缓存机制等知识&#xff0…

[附源码]计算机毕业设计房屋租赁系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis MavenVue等等组成,B/S模式…

算法竞赛入门【码蹄集进阶塔335题】(MT2201-2225)

算法竞赛入门【码蹄集进阶塔335题】(MT2201-2225) 文章目录算法竞赛入门【码蹄集进阶塔335题】(MT2201-2225)前言为什么突然想学算法了?为什么选择码蹄集作为刷题软件?目录1. MT2201 字符串转换2. MT2202 Summer Pockets3. MT2203…

alsa框架与音频芯片移植基础

ALSA音频框架 Alsa是Advanced Linux Sound Architecture的缩写,即高级Linux声音架构,在Linux操作系统上提供了对音频和MIDI的支持。在Linux 2.6的内核版本后,Alsa目前已经成为了linux的主流音频体系结构。 除了 alsa-driver,ALS…

CSS -- 使用纯CSS绘制三角形及常见案例汇总

文章目录1. 绘制原理2. 绘制最简单的三角形3. 绘制对话框4. 绘制两条直角边不等长的三角形1. 绘制原理 网页中常见一些三角形,使用 CSS 直接画出来就可以,不必做成图片或者字体图标 给每个边框不同的颜色可以看到,每个边框其实都是一个小三…

测试(缺陷管理)

目录 1.缺陷管理理论 1.1.定义 1.2缺陷的名称 1.3.产生缺陷的原因 1.4.缺陷管理流程 1.5.缺陷管理生命周期与状态 2.如何提交缺陷 2.1.提交的Bug的目的 2.2.提交Bug的注意事项 2.3.提交Bug报告应遵循的原则 2.4.Bug报告需包含哪些内容 1.缺陷管理理论 1.1.定义 软件…