【区块链与密码学】第2-3讲:区块链基础技术大剖析之哈希函数

2023-11-20

【本课堂内容全部选编自PlatON首席密码学家、武汉大学国家网络安全学院教授、博士生导师何德彪教授的《区块链与密码学》授课讲义、教材及互联网,版权归属其原作者所有,如有侵权请立即与我们联系,我们将及时处理。】

2.4.1 哈希函数

区块链作为一个诞生刚到十几年的技术,的确算是一个新兴的概念,但是它所用到的基础技术全是当前非常成熟的技术。可以说是一个技术的“结晶体“。

区块链的基础技术如哈希运算、数字签名、P2P网络、共识算法以及智能合约等,在区块链兴起之前,很多技术已经在各种互联网应用中被广泛使用。

但这并不意味着区块链就是一个新瓶装旧酒的东西。就好比积木游戏,虽然是一些简单有限的木块,但是组合过后,就能创造出一片新的世界。

同时,区块链也并不是简单的重复使用现有技术,例如共识算法、隐私保护在区块链中已经有了很多的革新,智能合约也从一个简单的理念变成了一个现实。

区块链“去中心化”或“多中心”这种颠覆性的设计思想,结果其数据不可篡改、透明、可追溯、合约自动执行等强大能力,足以掀起一股新的技术风暴。

本节课主要探讨这些技术的原理及在区块链系统中的作用。首先从哈希函数说起。

什么是哈希运算

哈希算法(Hash Algorithm)即散列算法的直接音译。它的基本功能概括来说,就是把任意长度的输入(例如文本等信息)通过一定的计算,生成一个固定长度的字符串,输出的字符串称为该输入的哈希值。在此以常用的SHA-256算法分别对一个简短的句子和一段文字求哈希值来说明。

输入:

This is a hash example!

哈希值:

17f2cf0bcbfbc11a8ab6b6883b03c721407da5c97

45d46a5fc53830d4749504a

我们在第一单元课程中对涉及哈希函数的公钥与私钥的的换算有细致的讲解,请看:

点宽课堂第1-4讲:比特币的交易

哈希运算的特性

一个优秀的哈希算法要具备正向快速、输入敏感、逆向困难、强抗碰撞等特征。

正向快速

正向即由输入计算输出的过程,对给定数据,可以在极短时间内快速得到哈希值。如当前常用的SHA256算法在普通计算机上一秒钟能做2000万次哈希运算。

输入敏感

输入信息发生任何微小变化,哪怕仅仅是一个字符的更改,重新生成的哈希值与原哈希值也会有天壤之别。同时完全无法通过对比新旧哈希值的差异推测数据内容发生了什么变化。

因此,通过哈希值可以很容易地验证两个文件内容是否相同。该特性广泛应用于错误校验。在网络传输中,发送方在发送数据的同时,发送该内容的哈希值。

接收方收到数据后,只需要将数据再次进行哈希运算,对比输出与接收的哈希值,就可以判断数据是否损坏。

逆向困难

要求无法在较短时间内根据哈希值计算出原始输入信息。该特性是哈希算法安全性的基础,也因此是现代密码学的重要组成。哈希算法在密码学中的应用很多,此处仅以哈希密码举例进行说明。

当前生活离不开各种账户和密码,但并不是每个人都有为每个账户单独设置密码的好习惯,为了记忆方便,很多人的多个账户均采用同一套密码。

如果这些密码原封不动地保存在数据库中,一旦数据泄露,则该用户所有其他账户的密码都可能暴露,造成极大风险。所以在后台数据库仅保存密码的哈希值,每次登录时,计算用户输入的密码的哈希值,并将计算得到的哈希值与数据库中保存的哈希值进行比对。

强抗碰撞性

即不同的输入很难可以产生相同的哈希输出。当然,由于哈希算法输出位数是有限的,即哈希输出数量是有限的,而输入却是无限的,所以不存在永远不发生碰撞的哈希算法。

但是哈希算法仍然被广泛使用,只要算法保证发生碰撞的概率够小,通过暴力枚举获取哈希值对应输入的概率就更小,代价也相应更大。只要能保证破解的代价足够大,那么破解就没有意义。

就像我们购买双色球时,虽然我们可以通过购买所有组合保证一定中奖,但是付出的代价远大于收益。优秀的哈希算法即需要保证找到碰撞输入的代价远大于收益。

区块链科普之哈希函数的应用

哈希函数在区块链之前,就已经得到了广泛应用,以下为一些常见的应用场景:

消息认证码

使用单向散列函数可以构造消息认证码。消息认证码是将“发送者和接收者之间的共享密钥”和“消息,进行混合后计算出的散列值。使用消息认证码可以检测并防止通信过程中的错误、篡改以及伪装。

数字签名

在进行数字签名时也会使用单向散列函数。数字签名是现实社会中的签名(sign)和盖章这样的行为在数字世界中的实现。数字签名的处理过程非常耗时,因此一般不会对整个消息内容直接施加数字签名,而是先通过单向散列函数计算出消息的散列值,然后再对这个散列值施加数字签名。

伪随机数生成器

使用单向散列函数可以构造伪随机数生成器。密码技术中所使用的随机数需要具备“事实上不可能根据过去的随机数列预测未来的随机数列”这样的性质。为了保证不可预测性,可以利用单向散列函数的单向性。

一次性口令

使用单向散列函数可以构造一次性口令(one-time password)。一次性口令经常被用于服务器对客户端的合法性认证。在这种方式中,通过使用单向散列函数可以保证口令只在通信链路上传送一次(one-time),因此即使窃听者窃取了口令,也无法使用。

本内容来自用户“wilsonyx”的总结

防篡改是哈希的功劳?

每个区块头包含了上一个区块数据的哈希值,这些哈希层层嵌套,最终将所有区块串联起来,形成区块链。

区块链里包含了自该链诞生以来发生的所有交易,因此,要篡改一笔交易,意味着它之后的所有区块的父区块哈希全部要篡改一遍,这需要进行大量的运算。

如果想要篡改数据,必须靠伪造交易链实现,即保证在正确的区块产生之前能快速地运算出伪造的区块。同时在以比特币为代表的区块链系统要求连续产生一定数量的区块之后,交易才会得到确认,即需要保证连续伪造多个区块。

只要网络中节点足够多,连续伪造的区块运算速度都超过其他节点几乎是不可能实现的。

另一种可行的篡改区块链的方式是,某一利益方拥有全网超过50%的算力,利用区块链中少数服从多数的特点,篡改历史交易。

然而在区块链网络中,只要有足够多的节点参与,控制网络中50%的算力也是不可能做到的。如果某一利益方拥有了全网超过50%的算力,它就已经成为既得利益者,从收益角度来看,维护会比破坏价值更大,因此肯定会更坚定地维护区块链网络的稳定性。

可以实现内容改变快速检测的一种树

除上述防篡改特性,基于哈希算法组装出的默克尔树也在区块链中发挥了重要作用。默克尔树本质上是一种哈希树,1979年瑞夫·默克尔申请了该专利,故此得名。

前面已经介绍了哈希算法,在区块中默克尔树就是当前区块所有交易信息的一个哈希值。但是这个哈希值并不是直接将所有交易内容计算得到的哈希,而是一个哈希二叉树。

首先对每笔交易计算哈希值;然后进行两两分组,对这两个哈希值再计算得到一个新的哈希值,两个旧的哈希值就作为新哈希值的叶子节,如果哈希值数量为单数,则对最后一哈希值再次计算哈希值即可;

然后重复上述计算,直至最后只剩一个哈希值,作为默克尔树的根,最终形成一个二叉树的结构。在区块链中,我们只需要保留对自己有用的交易信息,删除或者在其他设备备份其余交易信息。

如果需要验证交易内容,只需验证默克尔树即可。若根哈希验证不通过,则验证两个叶子节点,再验证其中哈希验证不通过的节点的叶子节点,最终可以准确识别被篡改的交易。

有关于哈希函数就讲到这里啦,下节课我们将解析区块链基础技术之数字签名,和我们日常的签名有什么不一样呢?下节课揭晓!

关注点宽学园,每周持续更新区块链系列课程,小宽带你进入区块链世界。

【区块链与密码学】课堂回顾:

区块链与密码学系列文章合集

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

【区块链与密码学】第2-3讲:区块链基础技术大剖析之哈希函数 的相关文章

  • 【Docker】之安装 Redis

    一 下载 Redis 镜像 下载最新版 Redis 镜像 默认版本为 latest docker pull redis 更多版本镜像 1 访问 Docker 官网 https hub docker com 在镜像搜索栏中输入 Redist
  • flea-auth使用之用户子模块介绍

    用户子模块 本篇主要介绍笔者 授权模块 flea auth 下的用户子模块 1 总览 表名 中文描述 flea account 账户 flea account attr 账户扩展属性 flea user 用户 flea user attr

随机推荐

  • libevent的消息传递和回调注册函数

    参考原帖地址 https www cnblogs com secondtonone1 p 5554075 html 1 evconnlistener new bind函数 1 evconnlistener new bind 完成socket
  • JDK8下载安装

    参考 JDK8下载安装教程 涵涵想养猫的博客 CSDN博客 jdk8下载安装 下载地址 https www oracle com java technologies javase javase jdk8 downloads html 根据需
  • python 中 os._exit(), sys.exit()

    1 os exit 不抛异常 后面的代码就不执行了 不执行相关清理工作 直接退出 Python 解释器一般来说用在子线程中退出 2 sys exit 引发一个 SystemExit 异常 没有捕获这个异常 会直接退出 捕获这个异常可以做一些
  • 软考:中级软件设计师:程序语言基础:表达式,标准分类,法律法规,程序语言特点,函数传值传址

    软考 中级软件设计师 程序语言基础 表达式 提示 系列被面试官问的问题 我自己当时不会 所以下来自己复盘一下 认真学习和总结 以应对未来更多的可能性 关于互联网大厂的笔试面试 都是需要细心准备的 1 自己的科研经历 科研内容 学习的相关领域
  • 禁止ios浏览器页面上下滚动 (橡皮筋效果)弹性滚动 微信的下拉回弹

    发现之前阻止页面滚动的代码e preventDefault代码失效了 于是自己折腾了一番 找到了解决办法 一 前言 浏览器在移动端有一个默认触摸滚动的效果 让我们感触最深的莫过于微信浏览器里面 下拉时自带橡皮筋的效果 然而在开发的时候我们经
  • 软件测试日常分享

    以下是测试主管 测试经理 质量保证经理的面试问题和答案 供新人和有经验的求职者获得他们梦想的工作 1 测试经理的职责是什么 QA经理的角色包括 从启动到结束管理项目 测试计划 获得客户对交付成果的认可 向客户端批准中间交付物和补丁发布 提交
  • 动手学深度学习——softmax回归(原理解释+代码详解)

    目录 1 softmax回归 1 1 分类问题 1 2 网络架构 1 3 全连接层的参数开销 1 4 softmax运算 1 5 小批量样本的矢量化 1 6 损失函数 1 6 1 对数似然 1 6 2 softmax及其导数 1 6 3 交
  • 算法导论 学习笔记 第七章 快速排序

    快排最坏时间复杂度为 n 但它的平均性能很好 通常是实际排序应用中最好的选择 它的期望时间复杂度为 nlgn 且 nlgn 中隐含的常数因子非常小 且它还能进行原址排序 快排也使用了分治思想 1 分解 数组被划分为两个子数组 使得一个子数组
  • 服务器如何开多个虚拟机,服务器运行多个虚拟机

    服务器运行多个虚拟机 内容精选 换一换 通过内网连接云手机实例时 需要在租户VPC中创建一台弹性云服务器 作为连接云手机的跳板机器 若创建云手机服务器时未使用自定义网络 还需在云手机租户的VPC和服务器所在VPC之间建立对等连接 如图1所示
  • SpringBoot集成Netty时在Handler类中注入service和dao为null

    最近在做一个服务器接收客户端消息 之前一直都只接触web开发 第一次接触服务器开发 接触到Netty 但在Netty的Handler类里注入为null public class HttpRequestHandler extends Simp
  • 【vue3练习 -12】vue3使用readonly(),shallowReadonly()

    作用 把一个响应式 可以是ref定义的 也可以是reactive定义的 的数据变成只读的 不可以修改 使用场景 假如你的组件有个数据 但是你不希望在使用的时候修改他就可以把他变成只读的 用法示例 import readonly shallo
  • SOLO算法解读

    论文 SOLO Segmenting Objects by Locations 论文链接 https arxiv org abs 1912 04488 代码链接 GitHub WXinlong SOLO SOLO and SOLOv2 fo
  • 安全之安全(security²)博客目录导读

    研究方向 安全之安全 研究内容 ARM RISC V安全架构 TF A TEE之安全 GP安全认证 静态代码分析 FUZZ模糊测试 IDA逆向分析 安全与功耗等 欢迎您的关注 一 ARM安全架构 1 ARM安全架构及其发展趋势 转载 2 A
  • uc同步登陆同步退出

    几乎每个应用在整合UC的时候都会遇到无法同步登陆同步退出的情况 今天分析下原因 首先我们的项目会将uc client这个文件夹原封不动的拷贝到项目根目录 public function inteLogin loginname passwor
  • 从零开始学Python(一)基本变量与数据类型

    Welcome Huihui s Code World 接下来看看由辉辉所写的关于Python的相关操作吧 目录 Welcome Huihui s Code World 一 关于Python的基本知识 变量 注释 二 数据类型 1 强类型
  • 蝴蝶效应,青蛙现象,鳄鱼法则,鲇鱼效应,羊群效...

    标题 蝴蝶效应 青蛙现象 鳄鱼法则 鲇鱼效应 羊群效应 刺猬法则 手表定律 破窗理论 二八定律 木桶理论 马太效应 这些你都明白吗 1 蝴蝶效应 上个世纪70年代 美国一个名叫洛伦兹的气象学家在解释空气系统理论时说 亚马逊雨林一只蝴蝶翅膀偶
  • pycharm快捷键及一些常用设置

    Alt Enter 自动添加包 shift O 自动建议代码补全 Ctrl t SVN更新 Ctrl k SVN提交 Ctrl 注释 取消注释 选择的行 Ctrl Shift F 高级查找 Ctrl Enter 补全 Shift Enter
  • 安装ThinkPHP5.1并在框架中使用FFmpeg视频处理工具遇到的问题和解决办法

    一 安装ThinkPHP5 1框架 问题一 安装方法有很多 我这里使用composer安装的 但是遇到了问题 出现了报错 安装方法可是查看 https www kancloud cn manual thinkphp5 1 353948 co
  • FreeRTOS中断管理

    目录 说明 一 中断基础 1 1 中断理解 1 2 中断执行步骤 1 3 中断寄存器选择位 1 4 中断优先级分类 二 中断优先级分组设置 2 1 分类 2 2 特点 三 中断有关寄存器 3 1 SHPR1寄存器 3 2 SHPR2寄存器
  • 【区块链与密码学】第2-3讲:区块链基础技术大剖析之哈希函数

    本课堂内容全部选编自PlatON首席密码学家 武汉大学国家网络安全学院教授 博士生导师何德彪教授的 区块链与密码学 授课讲义 教材及互联网 版权归属其原作者所有 如有侵权请立即与我们联系 我们将及时处理 2 4 1 哈希函数 区块链作为一个