实锤:写高质量代码,不然加密货币仍然可被攻击并篡改

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 策划|Tina编译|核子可乐区块链前哨导语: 我们知道区块链是一个个 Block 组成,而 Block 由校验值和实际数据组成,通常 Block 的头部存放着前一个 Block 的 Hash 校验值。

29a371b4ca2ad3129c313eda8deea331e68d7fc5

策划|Tina编译|核子可乐 区块链前哨导语:  我们知道区块链是一个个 Block 组成,而 Block 由校验值和实际数据组成,通常 Block 的头部存放着前一个 Block 的 Hash 校验值。适合编写区块链的数据结构一般首选是梅克尔树(Merkle Tree),可通过该结构进行溯源校验。最近有人再次验证了如何对梅克尔树进行攻击,从而可制造假的中间叶子,达到篡改目的。造成这一切的原因很可能是因为程序员在实现梅克尔树时造成的。该问题在 Reddit 上也引起了不少讨论,并有人在 github 上提供了可被攻击的代码写法。

更多干货内容请关注微信公众号“区块链前哨”,(ID:blockchain-666)


区块链结构

比特币区块包含两种数据结构。上面的部分是基于哈希的区块链。每个区块的区块头部都包含一个哈希指针指向上一个区块。第二种数据结构是梅克尔树(Merkle tree),它将包含的交易用高效的方式(log(n))组织起来。

57d9b01d987487c87effe442b6809ed98210526b

梅克尔树是一种非常简单的数据结构,其允许将数据块(无论是文件等初始数据块,抑或是有意拆分的数据块)以独立及分布方式进行计算。

举个例子:如果您拥有 2000 个大小为 1 GB 的文件,并希望为数据计算 SHA256,大家通常需要将所有文件连接在一起,并获取单一数据哈希值。出于各种实际原因,这样的处理方式往往会引发问题——例如如果单一文件中的单一字节发生变化,则需要对这部分总体积高达 2 TB 的数据重新运行 SHA256 散列计算。另外,除非您拥有全部 2000 个文件,否则您将无法计算该哈希值——换言之,您只能从头开始计算新的散列值。

梅克尔树能够对单一数据块进行散列计算(在以上示例中,即各个 1 GB 文件),而后构建散列二叉树的方式得出能够代表整体数据块的单一哈希值。这意味着如果单一文件发生变化,您只需要重新对该文件进行散列计算,而后得出哈希结果即可。很明显,这是一种效率更高、速度更快的处理方式。

以下为梅克尔树在维基百科页面中的原理示意图:

1c90102ecc67f0da9e43c5dc3820ab3424fca422


如何进行攻击

我们把这个攻击说明原文进行了翻译:

下面将概述梅克尔树实现中存在的一种常见缺陷,并演示当前最受欢迎的各相关 Python 库可能因此遭遇的潜在威胁。

我们利用的是次原像攻击。所谓次原像攻击,是指攻击者提供一个哈希指纹,并借此找到任何与该值相符的数据哈希。

举例来说,如果给定 MD5 值为 5EB63BBBC01EEED093CB22BB8F5ACDC3,而您可以发现实际生成该哈希值的数据,则意味着您利用次原像攻击破解了该 MD5 值。备注:MD5 为 128 位哈希函数,而目前最强大的原像攻击能够将其强度削减为 123 位——但这样的复杂度对原像攻击而言仍然过高。事实上,导致 MD5 被弃用的重大缺陷体现为碰撞攻击——攻击者可以生成两条输入内容,二者可通过散列处理得到同样的哈希值,但不具备可控性或可预测性。

而所谓次原像攻击,则意味着为我们提供一些数据,并要求我们找到能够产生与之生成同样哈希值的第二组数据。其与普通原像攻击非常相似,但我们拥有一项额外的提示信息——即已经掌握了一组可产生目标哈希值的数据样本。次原像攻击在实施难度上甚至高于碰撞攻击,因为其中一组数据样本并不在攻击者的控制范围之内。


针对梅克尔树的次原像攻击

但在另一方面,针对梅克尔树的攻击其实非常简单。在这里,我们拥有一项基本前提,即如果将一系列输入内容传递至梅克尔树并获取 root 哈希值,则不可能有其它输入结果能够得出同样的哈希值。不过遗憾的是,由于实现方案中存在的一项小缺陷,这样的前提并不成立。

在以上示例当中,我们的输入内容为 L1、L2、L3 以及 L4。其最终在示意图上方输出了 root 哈希值。不过如大家所见,中间层当中的输入内容为上一层的串连哈希,而我们可以将这两个值直接输入克尔树以获得同样的 root 哈希值。

这里需要强调的是,此种攻击在底层散列函数不存在已知安全缺陷的前提下也同样可行。事实上,这属于梅克尔树构建层面的一种本质性问题。

下面我们将通过另一个示例进一步作出解释。


示例攻击

这里我们不再使用示例代码,而选择“python merkle tree”解释攻击方法,并通过 GitHub repo 及配合 MT 加以实现。此外,我们还编写了简单的概念验证代码以演示这项缺陷。

第一个示例为:

https://github.com/JaeDukSeo/Simple-Merkle-Tree-in-Python。

首先,我们导入梅克尔树实现方案以及用于显示输出结果的 json 库。在此之后,我编写了一条简单的函数以构造一个 MT 对象,分配一系列“transaction”(即数据块),最后利用这些数据构造梅克尔树并输出 root 节点,同时提取该树的哈希值以展示 root 节点的生成过程。

82068e89cdc2a63297a86ff82a9183921167d6b2

在这里,我们展示了被传递至这套实现方案中的三个值,其都将输出同样的哈希值:

6bb156f8fe762d4094cd507ca705b46e083fdd0f

在 transaction1 当中,我传递四个值:a、b、c、d。

在 transaction2 当中,我传递两个值,其各自为先前值的串连哈希值——例如 hash(a)+hash(b) 与 hash(c)+hash(d),这里我使用加号来代表串连。

在 transaction3 当中,我仅传递一个值:来自上一层输出结果的哈希串连。

最终输出结果(其中完整的树提取结果被注释掉了)如下所示:

0f4ae7d9d98a4ace5ebbe535823c8e30ea44f135

第二个示例为:https://github.com/Tierion/pymerkletools ,可使用“pip install merkletools”命令进行安装。以下代码采用类似的方法,且内容相当明确。

0fb6293d48c8ee162cc61b21352383693beaf94f

其将生成以下输出结果:

2811c463605ef110c66f5a1c097777f85c630b87


攻击局限性

在现实世界中(例如比特币场景下),这种攻击往往不会受到关注。这是因为其存在严重的局限性,即尽管我们可以找到能够与输入内容 X 生成相同哈希值的输入内容 Y,但我们对 Y 的值及其格式毫无控制能力。这意味着对于任何伪造梅克尔树进行数据完整性检查的应用程序而言,这些人为制作的输入内容无法以有用的方式进行解释。但这种方式仍能够用于实施拒绝服务攻击,这是由于匹配的哈希值将无法保证数据完整性,进而导致数据遭到 覆盖或替换


如何修复

幸运的是,这个问题的修复方法同样相当简单。其基本思路在于为叶节点及中间节点预先设置一个不同的字节值(例如在证书透明度实现中设置 0x00 以及 0x01),从而对这两类节点进行区分。另外,大家也可以将树深度或节点深度作为数据结构的组成部分进行记录,如此一来攻击者将无法直接传递中间值。




原文发布时间为:2018-03-14
本文作者:关注安全的
本文来源:微信公众号-区块链前哨,如需转载请联系原作者。

目录
相关文章
|
5月前
|
移动开发 JavaScript 安全
Vue 应用程序性能优化:代码压缩、加密和混淆配置详解
Vue 应用程序性能优化:代码压缩、加密和混淆配置详解
235 0
|
23天前
|
存储 安全 数据安全/隐私保护
安全升级!Python AES加密实战,为你的代码加上一层神秘保护罩
【9月更文挑战第12天】在软件开发中,数据安全至关重要。本文将深入探讨如何使用Python中的AES加密技术保护代码免受非法访问和篡改。AES(高级加密标准)因其高效性和灵活性,已成为全球最广泛使用的对称加密算法之一。通过实战演练,我们将展示如何利用pycryptodome库实现AES加密,包括生成密钥、初始化向量(IV)、加密和解密文本数据等步骤。此外,还将介绍密钥管理和IV随机性等安全注意事项。通过本文的学习,你将掌握使用AES加密保护敏感数据的方法,为代码增添坚实的安全屏障。
41 8
|
2月前
|
安全 Java Shell
"SpringBoot防窥秘籍大公开!ProGuard混淆+xjar加密,让你的代码穿上隐形斗篷,黑客也无奈!"
【8月更文挑战第11天】开发SpringBoot应用时,保护代码免遭反编译至关重要。本文介绍如何运用ProGuard和xjar强化安全性。ProGuard能混淆代码,去除未使用的部分,压缩字节码,使反编译困难。需配置ProGuard规则文件并处理jar包。xjar则进一步加密jar包内容,即使被解压也无法直接读取。结合使用这两种工具可显著提高代码安全性,有效保护商业机密及知识产权。
197 3
|
2月前
|
安全 开发者 数据安全/隐私保护
Xamarin 的安全性考虑与最佳实践:从数据加密到网络防护,全面解析构建安全移动应用的六大核心技术要点与实战代码示例
【8月更文挑战第31天】Xamarin 的安全性考虑与最佳实践对于构建安全可靠的跨平台移动应用至关重要。本文探讨了 Xamarin 开发中的关键安全因素,如数据加密、网络通信安全、权限管理等,并提供了 AES 加密算法的代码示例。
36 0
|
2月前
|
存储 安全 数据安全/隐私保护
安全升级!Python AES加密实战,为你的代码加上一层神秘保护罩
【8月更文挑战第2天】数据安全至关重要,AES加密作为对称加密的标准之一,因其高效性与灵活性被广泛采用。本文通过实战演示Python中AES的应用,使用pycryptodome库进行安装及加密操作。示例代码展示了生成随机密钥与初始化向量(IV)、对数据进行加密及解密的过程。注意事项包括密钥管理和IV的随机性,以及加密模式的选择。掌握AES加密能有效保护敏感数据,确保信息安全无虞。
54 6
|
4月前
|
JavaScript 数据安全/隐私保护
JS代码是怎样被混淆加密的
JS代码是怎样被混淆加密的
33 3
|
4月前
|
开发框架 Java .NET
WAF攻防-权限控制&代码免杀&异或运算&变量覆盖&混淆加密&传参
WAF攻防-权限控制&代码免杀&异或运算&变量覆盖&混淆加密&传参
|
5月前
|
算法 安全 测试技术
【传知代码】图像加密解密与数字水印处理-论文复现
该文主要介绍了图像加密解密和数字水印处理的重要性,并提供了相关技术的概述和原理。文章首先强调了信息安全和数据保护在数字化时代的需求,然后分别介绍了图像加密和解密以及数字水印处理的概念。 在图像加密解密部分,提到了两种方法:基于混沌Logistic映射的加密和基于三重DES的加密。前者通过混沌理论进行加密,后者使用经典的三重DES算法。文章提供了每种方法的基本原理,并展示了如何在Python中实现它们,包括使用`cryptography`库进行AES加密和利用PIL库进行图像处理。
【传知代码】图像加密解密与数字水印处理-论文复现
|
5月前
|
算法 PHP 数据安全/隐私保护
【实战】PHP代码逆向工具,轻松还原goto加密语句的神器!
`goto解密工具`是一款针对PHP的在线神器,能有效解密和还原goto加密代码,提升代码可读性和可维护性。支持单文件及50M压缩包一键解密,提供全效解决方案。通过实际案例展示了解密报错和理解复杂代码的能力,是PHP开发者解决goto难题的得力助手。立即体验:[在线PHP解密大师](https://copy.kaidala.com/dala/goto/index.html)。
88 1
|
5月前
|
前端开发 算法 JavaScript
实现注册登录时数据的加密传输(含前后端具体代码)
实现注册登录时数据的加密传输(含前后端具体代码)
下一篇
无影云桌面