区块链安全,哈希函数暴露的攻击向量与对策

news2024/11/25 2:51:41

区块链安全,哈希函数暴露的攻击向量与对策

简介
Length Extension Attack 是一种与某些特定类型的哈希函数(如 MD5,SHA-1 和 SHA-2)的特性有关的攻击。简单来说,这种攻击利用了一个事实,即知道 H(message) 和 message 的长度,我们可以轻松计算出 H(message || padding || extension) 而不需要知道 message 本身。其中 “||” 表示连接,“padding” 是根据哈希函数的规定添加的。

这是因为这些哈希函数使用了 Merkle-Damgård 结构,它将输入切片为多个块,并且每个块的哈希值依赖于前一个块的哈希值。这意味着一旦我们计算出了某个消息的哈希值,就有了一个状态,可以从那里开始并添加更多的块。

一种服务端验证模式

为方便描述漏洞场景,我们首先假设有这样一种服务端验证模式,即用户尝试登录时,服务端会根据用户的 ID、名字以及一个仅服务端知道的 30 位密钥,通过特定的哈希算法生成一个哈希值,并将其下发给客户端。随后,当客户端尝试访问某些特定接口,例如修改用户权限的接口时,服务端会根据前端 POST 的角色 ID、角色名字、角色权限以及同样的 30 位密钥,重新生成哈希进行验证。如果上传的哈希与服务端生成的哈希一致,则视为验证通过,并将新的角色权限写入数据库。

为便于理解,下面是根据描述写的一些简单的代码做为示例:

越权思路

由于验证模式存在漏洞,攻击者可以在不知道 SecretKey 的情况下,通过重新构造交易请求,达到绕过权限验证的目的。越权攻击的核心思路在于利用长度扩展攻击的特性。攻击者首先需要获取到原始的哈希值,并通过简单的迭代算法计算出原始数据的长度。一旦得到这些信息,就可以将额外的越权参数添加到原始数据中,并利用相同的哈希算法生成恶意的哈希值。

长度扩展攻击原理

Length Extension Attack 发生的原因在于部分哈希函数的内部机制。这些函数在处理输入数据前,首先将数据分割成固定长度的块,然后在每个块的末尾进行填充以满足特定的要求。这种设计导致攻击者可以在知道原始消息哈希值和长度的情况下,通过填充和附加新数据,构造出新的有效哈希值。

以 SHA-256 为例,其工作在 512 比特的块上。对于长度不是 512 比特的倍数的数据,需要进行填充操作。其填充规则如下:

  1. 在数据的末尾添加一个 “1” 比特;
  2. 添加一定数量的 “0” 比特,使得数据的长度模 512 等于 448(详细内容见 [1]);
  3. 在最后面添加一个 64 位长的块,表示原始数据的长度。

简而言之,将一个 “1” 后面跟着 m 个 “0”,再加上一个 64 位或 128 位的整数,附加到消息的末尾,以生成长度为 512*n 的填充消息。附加的整数是原始消息的长度。然后,填充消息将被哈希函数处理为 n 个 512 位的块。

构造方法

在这个示例中,我们将以上面图片提到的代码做为一个特定的场景,其中数据字符串为 data=“user_id=1&user_name=aa”,密钥为 SecretKey=“Length_extension_attack_secret”。服务端会解析上传的数据中的 data 字段,并通过分隔符 & 解析出所需的参数 user_id 和 user_name。如果存在 role 字段,服务端也会获取该字段的值。然后,服务端会将所有字段与 SecretKey 进行哈希运算,并与上传的验证哈希进行比较。如果哈希值一致,则认为参数符合规则,并直接使用。

首先,我们通过登录 loginHandler 接口获取根据 data 和 SecretKey 使用 SHA-256 生成的哈希值 hash=“37d310d3465506486431fb2c2eb163f0f470479703f66dc9e5fdead8a3390c68”。

接下来,我们将探讨破解的难度。以我们的测试情况为例,根据长度扩展攻击的原理,只要知道 H(message) 和 message 的长度,我们就可以通过长度扩展攻击添加新的数据。原来的 message = SecretKey + data,现在我们手上已经有 H(message),只需知道 message 的长度,就可以构造一个新的哈希值。由于 SecretKey 是一个 30 位的密钥,只需经过 30 次迭代,就可以得知真正的 message 的长度。因此,我们可以很容易地构造出一个新的哈希值。由于我们需要使用 admin 的权限,所以我们要将恶意的字段 “&role=admin” 拼接到原来的数据中。

我们可以利用长度扩展攻击的特性,在不知道 SecretKey 的情况下,添加新的数据并生成一个新的哈希值。这里使用一个已经实现此功能的库 [2] 来完成测试。再使用工具生成新的哈希值 。

由于 adminActionHandler 的接口验证是根据上传的 user_id,user_name 和 role 来验证 hash 的,我们这时候上传的数据是 user_id=1,user_name=aa\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x70 以及 role=admin,如下图所示:

哈希值为 84ae4ae437eeabf3bd8a26294392770b86f64a81998194156ac003d58a21acd0。之后就可以调用 adminActionHandler 接口,服务端收到数据后,会把上传的哈希与 sha256(SecretKey + fakeData) 进行对比,通过验证之后将会执行一些敏感操作。这样,我们就成功地利用长度扩展攻击绕过了服务端验证,并实现了越权操作。

其他可能的攻击场景

**1. 文件完整性验证:**如果文件的完整性是通过连接密钥和文件内容,然后对其进行哈希来验证的,那么攻击者可能会扩展文件并生成一个有效的哈希,从而绕过完整性检查;
**2. Web 应用安全:**在 Web 应用中,如果使用了易受长度扩展攻击的哈希函数来验证用户提交的数据,攻击者可能会利用这一点来提交恶意数据;
**3. 数字签名:**在某些数字签名方案中,如果签名是通过连接私钥和消息,然后对其进行哈希来生成的,那么攻击者可能会扩展消息并生成一个有效的签名;
**4. 密码存储:**虽然不常见,但如果密码是通过连接密钥(例如盐)和密码,然后对其进行哈希来存储的,那么攻击者可能会尝试使用长度扩展攻击来破解密码。

如何防范

1. 选择不易受长度扩展攻击的哈希函数,例如 SHA-3;
**2. 使用 HMAC:**HMAC 需要一个密钥和一个消息作为输入,输出的结果既依赖于密钥,也依赖于消息,因此攻击者在不知道密钥的情况下无法进行长度扩展攻击;
**3. 加强权限验证:**在服务端增加额外的权限验证步骤,例如使用多因素认证。

以下是一些常用的 Hash 算法的特性:

算法碰撞抵抗选择前缀碰撞攻击预映像抵抗长度扩展攻击
MD52^182^392^123.4易受攻击
SHA-12^61.22^63.42^160易受攻击
SHA-256 (SHA-2)2^65.5-2^254.9易受攻击
SHA-512 (SHA-2)2^32.5-2^511.5易受攻击
SHA-32^50-未知不易受攻击
BLAKE2s2^112-2^241不易受攻击
BLAKE2b2^224-2^481不易受攻击

结语

对于长度扩展攻击,一种有效的防护措施是使用不受此类攻击影响的哈希函数,例如 SHA-3 和 BLAKE2。另外,还可以通过 HMAC(密钥散列消息认证码)结构来进行防护。这些措施可有效提高系统的安全性,确保数据完整性和应用程序的稳定性。

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

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

相关文章

Spring Boot 各版本的支持时间

1. Spring Boot 各版本的支持时间 Spring Boot 2.7 的版本,支持到2023-11-18,之后就要停止支持了。 按照官网的数据,3.0 的版本也是到2023年11月就停止支持了。如果要转到SpringBoot3,直接从3.1开始吧。到写这篇文章时&#xff…

如何在电脑和手机之间无线传输大文件?不限文件格式、不压缩画质

AirDroid个人版支持在 Windows、Mac、Linux、安卓、iOS 之间跨平台互传文件,无需数据线,没有文件类型的限制,更不用担心图片或视频的画质被压缩——无损传输,轻松高效。 如果设备连接的是同一网络(局域网内&#xff09…

【最优化】—— 最优化简介(一)

文章目录 前言最优化问题概括最优化问题的一般形式最优化问题的类型例子:稀疏优化 最优化的基本概念全局和局部最优解优化算法收敛性算法的渐进收敛速度算法的复杂度 前言 本系列文章作为最优化学习的相关笔记。参考书目:文再文老师的《最优化&#xff…

stm32f103步进电机S曲线加减速计算

S曲线主要实现低速扭力大,更快更稳 https://zhuanlan.zhihu.com/p/396648926?utm_campaign&utm_mediumsocial&utm_oi1361101006265331712&utm_psn1686906450235133952&utm_sourcezhihu 可点击上面链接查看啤酒杯的运动动画 摘自一段知乎上一段关于…

C#,数值计算——Logisticdev的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Structure for logistic deviates. /// </summary> public class Logisticdev : Ran { private double mu { get; set; } private double sig {…

PaddlePaddle Hackathon 飞桨黑客马拉松热身赛上线!

挑战自我 拓展技能 激发创新 挑战极限 再次相遇黑客松 我们期待你的加入&#xff01; 第五期 PaddlePaddle Hackathon 飞桨黑客马拉松热身赛上线&#xff0c;本次活动是面向全球开发者的深度学习领域编程活动&#xff0c;鼓励开发者了解和参与飞桨深度学习开源项目与文心大…

基于海康Ehome/ISUP接入到LiveNVR实现海康摄像头、录像机视频统一汇聚,做到物联网无插件直播回放和控制

LiveNVR支持海康NVR摄像头通EHOME接入ISUP接入LiveNVR分发视频流或是转GB28181 1、海康 ISUP 接入配置2、海康设备接入2.1、海康EHOME接入配置示例2.2、海康ISUP接入配置示例 3、通道配置3.1、直播流接入类型 海康ISUP3.2、海康 ISUP 设备ID3.3、启用保存3.4、接入成功 4、相关…

TC397 IfxAsclin串口收发分析

TC397 IfxAsclin串口收发分析 硬件FIFO 16 bytes TxFIFO 16 bytes RxFIFO 软件操作: 通过以上函数调用分析,可知: 1:初始化串口时,指定的FIFO为S/W 缓冲FIFO 2:ILLD提供的ISR操作函数: IfxAsclin_Asc_isrTransmit(&gstAsc2); IfxAsclin_Asc_isrReceive(&gs…

VMware虚拟机如何设置网络

一直没弄明白怎么能让虚拟机正常上网和访问&#xff0c;最近总结一个小经验 要在宿主机访问虚拟机电脑服务器&#xff0c;要设置成nat格式&#xff0c;虚拟机可以上网&#xff0c;宿主机访问虚拟机上的ip即可访问虚拟机里的服务器&#xff0c;也就是这样设置就行。 这时候ip不…

计算机网络层(2)

1.动态路由协议&#xff1a; 内部网关协议&#xff1a;用于一个自治系统的内部 外部网关协议&#xff1a;用于不同自治系统 RIP协议&#xff08;Routing Information Protocol&#xff0c;路由信息协议&#xff09;&#xff1a;路由信息协议是一种内部网关协议&#xff0c;是一…

【洛谷算法题】P5706-再分肥宅水【入门1顺序结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5706-再分肥宅水【入门1顺序结构】&#x1f30f;题目描述&#x1f30f;输入格式…

Python爬虫基础(五):使用scrapy框架

文章目录 系列文章索引一、scrapy简介1、什么是scrapy2、scrapy安装3、scrapy架构组成4、scrapy工作原理 二、scrapy基本使用1、创建项目2、创建爬虫文件3、&#xff08;附&#xff09;项目组成4、运行爬虫代码&#xff08;1&#xff09;修改baidu.py&#xff08;2&#xff09;…

css自学框架之平滑滚动

今天添加的功能是平滑滚动到指定位置&#xff0c;就是单击页面的按钮&#xff0c;平滑滚动页面到对应的元素&#xff0c;可添加偏移值。 示例&#xff1a;单击ID为gundongBTN 元素&#xff0c;页面平滑滚动到其指定的ID为#topdiv对应内容&#xff0c;同时保留 5px 的偏移间距。…

Java计算机毕业设计 基于SSM+Vue医药进出口交易系统的设计与实现 Java课程设计 实战项目

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

八、实时时钟

八、实时时钟 简介时钟芯片模块代码可调时钟 简介 引脚定义和应用电路 我们的开发板没有备用电池 寄存器定义 时序定义 在时钟的上升沿&#xff0c;IO口的数据被写入到芯片中&#xff0c;在下降沿&#xff0c;芯片就会将数据输出。如果是写入&#xff0c;那么在整个过程中&…

MySQL查询表结构方法

MySQL查询数据库单个表结构代码 – 查询数据库表信息 SELECT​ COLUMN_NAME 列名,​ DATA_TYPE 字段类型,​ CHARACTER_MAXIMUM_LENGTH 长度,​ IS_NULLABLE 是否为空,​ IF(column_key PRI,Y,) 是否为主键,​ COLUMN_DEFAULT 默认值,​ COLUMN_COMMENT 备注FROM​ INFORMAT…

c++ reference_wrapper源码注释

并给出图片&#xff0c;这样就不用下载了 谢谢

实现安全的服务通信:探索如何使用服务网格来确保服务间的安全通信

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

C++,基础函数、string、引用型变量reference

9月18日 C标准库。 一、C入门基础 1、基础 入口函数与C语言相同 后缀名使用cpp 注释与c语言相同 导入c标准库无需后缀 自定义头文件与c语言相同 using namespace std; std&#xff1a;名称空间&#xff08;全局区&#xff09; cout、endl属性名称空间“std” C输出没有格式…

linux入门到精通-第三章-vi(vim)编辑器

目录 文本编辑器gedit介绍vi(vim)命令模式命令模式编辑模式末行模式 帮助教程保存文件切换到编辑模式光标移动(命令模式下)复制粘贴删除撤销恢复保存退出查找替换可视模式替换模式分屏其他用法配置文件 文本编辑器 gedit介绍 gedit是一个GNOME桌面环境下兼容UTF-8的文本编辑器…