• 对于以中心化的中央银行来说需要做到防止篡改功能,那么其中场景就是中央银行控制供给,并加上防伪标识,但是依旧有人伪造,这时候再加上执法机构进行互补,对伪造的人给予一定的惩罚
  • 但是分布式没有中心处理中心就要通过密码原理进行防止篡改,于是就有了哈希函数,同时防篡改也是哈希函数最重要的功能

哈希函数

1.特性[1]

1.1三个特性:

  1. 输入可为任意大小的字符串。

  2. 它产生固定大小的输出。为使本章讨论更具体,我们假设输出值大小为256位,但是,我们的讨论适用于任意规模的输出,只要其足够大。

  3. 它能进行有效计算,简单来说就是对于特定的输入字符串,在合理时间内,我们可以算出哈希函数的输出。更准确地说,对应n位的字符串,其哈希值计算的复杂度为O(n)。

1.2 由于安全附加的几个特性:

  1. 碰撞阻力(collision-resistance);

    1. 找不到两个不同的值去映射到同一个值,无法将其产生碰撞,这就是常说的碰撞阻力;

    2. 图示如下:

    3. 注意到一个问题就是:虽然说有很多种情况,但是在有一些特殊方法之下就可能使得碰撞几率大大增大,最后完成碰撞;其中计算碰撞的概率有个很经典的理论:

      1. 生日悖论:

        1. 定义:某个班级里一共有 23 名学生。不考虑双胞胎、闰年等特殊情况,在这些男孩女孩中间,有 2 个人生日相同的概率是多少?

          1. 答:实际发生的概率要高达50.7%。
        2. 悖论所悖之处:

          1. 直觉上:我们会觉得发生的概念很小,毕竟一年有365天
          2. 实际上:实际上发生的概念很大,这主要是因为我们直觉和实际客观看待这个事情的出发点是不一样的——所以我们在计算的时候就会相比客观漏掉了很多
            1. 从我们自身去看,我们需要寻找的是与自己生日相同的人;
            2. 从客观来看,需要找到的只要是任意两个生日相同的人便是。
        3. 如何计算同年同月生的概率呢?

          1. 答:生日相同的组合个数所有组合个数=(所有组合个数−不同的组合个数)所有组合个数\frac{生日相同的组合个数}{所有组合个数}=\frac{(所有组合个数-不同的组合个数)}{所有组合个数}所有组合个数生日相同的组合个数​=所有组合个数(所有组合个数−不同的组合个数)​→365⋅364⋅363365⋅365⋅365=0.0082\frac{{365 \cdot 364 \cdot 363}}{{365 \cdot 365 \cdot 365}}=0.0082365⋅365⋅365365⋅364⋅363​=0.0082
        4. 我们经过总结:

          1. 一个人的生日一共有365 种可能。我们可以把这个问题写成一般形式,即在有n 种可能的情形下,要使至少有2人生日相同的概率达到50%,需要有如下的样本人数:

            • 1.18n1.18\sqrt n1.18n​
            • 对应到式子中就是
              1. (365天就是365种可能):1.18365=22.5...1.18\sqrt {365}=22.5...1.18365​=22.5...
              2. (12个月就是12种可能):1.1812=4.0876...1.18\sqrt {12} =4.0876...1.1812​=4.0876...
                • 也就是说,当样本人数大于等于5 时,存在相同出生月份的概率就将超过50%
        5. 实际应用场景:

          1. 生物识别的精确度:

            1. 衡量该精度的指标是错误接受率(False Acceptance Rate,简称FAR,也叫认假率)——也就是把他人的、不应该匹配的生物特征信息当成与用户本人匹配的信息。

            2. 带来的问题:虽然说生物识别精度很高,但是他们的总数实际上是一定的,那么虽然入库的人数不断增加,这就对应到一个班级的人数不断增加,那么自然产生相同的信息的人可能性就会更大,如下图所示:

              • 同样我们在DNA鉴定的时候一样会发生这样的事情,遇到同样的困难,并且有时候即使保证了理论上的很大概率不重合,但是我们需要知道概率和频率的区别——也就是即使是再少的概率也是可能发生,

                • 需要注意的一点就是:一旦出现DNA相同的事情但是人们认为DNA是不可能相同的话那就是可能导致很大的矛盾
                • 可能发生的场景:在美国的马里兰州,截至2007 年1 月,该州的DNA 数据库共收录了大约3 万人的信息。这个数字比256 万整整少了2 位数。但即使这样,实际上该地区也出现了不同人的DNA 被判定为一致的事件20。
            3. 不发生错误的概率公式:(1−p)n(n−1)2{(1 - p)^{\frac{{n(n - 1)}}{2}}}(1−p)2n(n−1)​

        6. 世界上没有哈希函数具有防碰撞特性。我们实践中依赖的加密的哈希函数仅仅是人们经过不懈努力之后暂未成功找到碰撞的函数。

          1. MD5MD5MD5:最终找到碰撞,使之慢慢在使用中被淘汰
        7. 作用:

          1. 当需要下载一个硕大的文件的时候,下载下来如何核对信息是否准备是我们面临的问题

            1. 答:通过核对hash摘要信息,由于碰撞原理的原因,使得在不发生碰撞的情况下我们不用去核对那硕大的文件,只需要对固定长度的hash信息进行比对就行。
  2. 隐秘性(hiding);

    1. 解释:我们仅仅知道hash函数的输出,但是没有一个可行的方法去算出来,也就是相当于把hash函数当成一个小黑盒子;

    2. 意义:在你知道结果的情况,无法反向求出输入的是什么

    3. 当其输入rrr选自一个高阶最小熵(high min-entroy)的概率分布,在给定H(rllx)H(rllx)H(rllx)条件下来确定xxx是不可行的。

      1. 高阶最小熵[2]

        1. 很大的时候:

          1. 如果r是从长度为256位的字符串中随意选出的,那么任意特定字符串被选中的概率为1/2 256 ,这是一个小到几乎可以忽略的取值;
          2. 让r这个随机变量是通过一个即使在“最保守”的情况下也有“很多”可能性,高度混乱,高度随机的系统中选取。
        2. 很小的时候:当我们进行设置密码的时候,通常设置自己生日相关这样会比较好记
    4. 实现:

      1. 承诺:

        装进
        放上面
        数字
        信封
        桌子上
        承诺:过程开始
        承诺:过程结束
        打开信封前
        打开信封后
        对其他人来说它还是秘密
        展现所承诺的数值

        1. 算法实现:

          信息msg
          临时随机数nonce
          承诺com
          确认程序verify
          对比com与输入msg和nonce计算得到的com是否一致
          真true
          否false

        2. 要求的特性:

          1. 隐秘性:已知comcomcom,没有可行的方法找到msgmsgmsg。——同时也是这一小节所需要给的定义在这里总结出来。

            • 定义:当其输入rrr选自一个高阶最小熵(high min-entroy)的概率分布,在给定H(rllx)H(rllx)H(rllx)条件下来确定是不xxx可行的。
            • 更像是平时我们需要中间人,只有通过中间人才能得到相应的信息,别人即使知道你承诺了这个东西,但是具体却不知道承诺的内容;
          2. 约束性:没有可行的办法找到两组(msg,nonce)(msg,nonce)(msg,nonce)和(msg′,nonce′)(msg',nonce')(msg′,nonce′),msg≠msgmsg \ne msgmsg​=msg,而commit(msg,nonce)==commit(msg′,nonce′)commit(msg,nonce)==commit(msg',nonce')commit(msg,nonce)==commit(msg′,nonce′)。
            • 对于所承诺的东西,这里面的信息你是不能找到其他信息去替代他的;
        3. 具体实施:

          1. 承诺的隐蔽性正好是hash的隐蔽性;
          2. 承诺的约束性也正好与hash的碰撞对应;
          3. 所以结合1和2,我们正好把hash函数作为承诺的实现
  3. 谜题友好(puzzle-friendliness):区块链中尤其需要,但是其他哈希函数使用到的场景却不一定需要

    1. 定义:

      1. 如果对于任意nnn位输出值yyy,假定k选自高阶最小熵分布,如果无法找到一个可行的方法,在比2n2^n2n小很多时间内找到xxx,保证H(k∣∣x)=yH(k||x)=yH(k∣∣x)=y成立,那么我们称哈希函数HHH为谜题友好;
      2. 集合Y并不是固定的,而是在一个集合范围,所以需要考虑的是这个集合的个数。由于输出是一个集合,那么只要找到其中一个就可以解决问题,但是如果这个集合是最小集合于是就变成需要遍历nnn个值。
    2. 解释:
      • 如果有一个人想找到y值所对应的输入,假定在输入集合中,有一部分是非常随机的,那么他将非常难以求得y值对应的输入。
    3. 与隐秘性的区别:隐秘性是针对于输入输出的单个x、y,而谜题友好是针对于输入输出的集合来说的。
    4. 区块链应用这一特性在挖矿中。

2.哈希函数在区块链中的应用[3]

比特币中大量使用SHA−256SHA-256SHA−256(Secure Hash Algorithm 256)哈希函数,并且效果还很好。

为了让hash函数能够接受各个长度的数字的方法:通过一般方法,就可以将接受固定长度的哈希函数转化为可接受任意长度输入的哈希函数,我们称这个转换过程为MDMDMD(Merkle-Damgard)变换,过程如下图所示:

首先将信息分为多个区块,每段区块等长(不够长度的可以在最开始前面补0),利用初始向量依次与所分区块进行计算得到固定长度数,每次将上一次计算结果加入本次计算中并与信息区块进行计算。通过这样的一系列计算使得无论多长的数都能得到固定长度的数目——也就是用时间的代价最后换来固定长度的摘要。

注意:

  • 需要注意的是并不是前面所讲的hash函数特性在每一个应用场景都会使用到,都是有选择性的使用。比如:第三个特性谜题友好一般就只是在区块链中使用。

2.1 hash指针及其结构

hash指针与普通指针的区别:

  • hash指针指向数据存储位置及其位置数据的哈希值的指针,不仅有位置指向而且还能保证没有被篡改过。

    • 注意:H(指针)H(指针)H(指针)表示有位置的指向并且防篡改,就相当于hash+指针(可以把它当成这样的结构体)

通过hash指针构建一个链表,我们将这个数据结构称为区块链(block chain)。其结构如下图所示——区块链的定义

所以hash指针特别适合放篡改这一应用,比如应用在日志的防篡改。

那么像区块链这样一种结构,如果我们想要进行篡改是如何的一种情况呢?

  • 答:如果你想要篡改某一节点的值,那么在更改当前节点之后势必就要跟随着更改下一节点,因为当前节点与上下相邻节点都是相连接的。所以最后肯定会追溯到第一个节点,只要将第一个节点更改然后接着的跟随更改,这样就能进行篡改,那么防止篡改也是一样,将第一个节点放在一个不能篡改的地方。

    • 与MD(SHA-256算法主要生成思想)一样,首要节点很重要,得保护好。

2.1.1 hash指针的应用

梅克尔树:

理解:通过在一个节点中建立两个hash指针构成树的左右节点。

详细结构

  • 在梅克尔树的数据结构中,所有的数据区块都被两两分组,指向这些数据区块的指针被存储在上一层的父节点(parent node)中,而这些父节点再次被两两分组,并且指向父节点的指针被存情在上一层的父节点中,一直持续这个过程,直到最后我们到达树的根节点。

结构图示如下

通过默克尔树进行隶属或者非隶属的证明:

  • 验证实例如下:

    • 主要过程:假设我们要验证区块中存在Hash值为9Dog:64(绿色框)的交易,我们仅需要知道1FXq:18、ec20、8f74(黄色框)即可计算出781a、5c71与Root节点(藕粉色框)的哈希

    • 图示:

  • 所以如果整棵树上有nnn个节点,只需要展示约log2(n)log_2(n)log2​(n)个项目,因为每个步骤仅需要计算子区块的哈希值,验证过程需要时间约为log2(n)log_2(n)log2​(n)。——我们可以从上图看到每次验证只需要知道同层次未知相邻的部分就行

参考文章

1.生日悖论

2.高阶最小熵的理解知乎

3.解读区块链全套六册.第四章.第四节

4.SHA-256算法实现

区块链重要基础知识2——哈希函数的原理以及应用于区块头部相关推荐

  1. 密码学系列(三):区块链+密码学基础知识

    密码学系列(三):区块链+密码学基础知识 一.区块链的概念 区块链概述 区块链的特点 区块链变化 市场现状 二.区块链政策与标准 区块链的特点与发展 三.区块链的定义 区块链的价值 四.区块链开发语言 ...

  2. 区块链重要基础知识7-1——标准脚本P2PKH、P2SH

    这里主要用于补充区块链重要基础知识7--比特币的运行机制中标准协议P2SH的说明 五大标准脚本分别为P2PKH.P2PK.MS(限15个密钥).P2SH和OP_Return. 这里主要介绍P2PKH. ...

  3. 区块链重要基础知识6——匿名性以及如何去中心化

    1. 匿名性 1.1 化名与匿名之间的区别 化名:在交易的时候不使用真实的姓名 匿名:或者在交易的时候完全不使用任何名字. 在计算机中的定义,匿名指的是具有无关联性(unlinkability)的化名 ...

  4. 区块链/比特币基础知识

    [三分钟讲清区块链/比特币]之一:区块链入门教程 [三分钟讲清区块链/比特币]之二:比特币入门教程 [三分钟讲清区块链/比特币]之三:加密货币的本质

  5. Comunion 区块链深度学习系列|哈希碰撞原理

    Comunion 是一个去中心化的(DAO) 组织协作网络,提供面向数字时代的全新商业基础设施和价值转化机制,致力于让劳动价值 像 资本一样自由流通.交易和积累. 本系列内容包含:基本概念及原理.密码 ...

  6. Hash(哈希)相关知识(哈希函数、哈希查找)

    Hash(哈希)相关知识 前言 一. 哈希函数 1. 函数特性 1.1 基本的哈希函数 1.2 加密的哈希函数 2. 常见的哈希函数构造法 2.1 直接寻址法 2.2 数字分析法 2.3 平方取中法 ...

  7. 【问链-区块链基础知识系列】 第十课 首席架构师谈区块链技术演进

    一.区块链和比特币,都有"币-链-网"三层含义 1.第一层含义是"币".这个"币"并不是刚才王行长所说的真正意义上的"货币&quo ...

  8. BlockChain:区块链技术基础概念综合理解——个人总结

    BlockChain:区块链技术基础概念综合理解--个人总结 目录 区块链的进阶与意义 1.区块链技术的进阶 2.区块链技术三大意义-传递价值.建立可信用环境.提高效率和降低成本 1.传递价值 2.建 ...

  9. 区块链技术基础:术语和用例

    一:区块和区块链网络 区块链是一种在整个业务网络上共享的分布式账本.业务交易被永久记录在有顺序的.仅可附加的.防篡改的账本区块中.所有经过确认和证明的交易都通过哈希算法从创始区块一直链接到最新的区块, ...

  10. 基于c#的区块链编程_C#编程之C#区块链零基础入门,学习路线图

    本文主要向大家介绍了C#编程之C#区块链零基础入门,学习路线图,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助. 一.1分钟短视频<区块链100问>了解区块链基本概念 http: ...

最新文章

  1. Java的File类
  2. 无重复字符串的排列组合
  3. 关于struts1的配置
  4. IT培训课、视频教程和书本之PK
  5. 不要争了,别的程序员是这么给变量起名的!
  6. dispatchTouchEvent onInterceptTouchEvent onTouchEvent区分
  7. Dataset和DataLoader构建数据通道
  8. springboot 做表白墙_华广表白墙 第六期|hsl每天都想和你嘻嘻哈哈
  9. python学习笔记 - lambda 与 函数嵌套
  10. 没有新芯片,没有“大核弹”,黄教主这次给大家带来了个PRADA
  11. Redhat或者Centos手动安装Vim,
  12. 数据可视化必备的高逼格图表特效,学会只需要五分钟
  13. MSSQL手札四 MSSQL的函数
  14. 5G 兴起、智能手机饱和、AI 普及......2019 年的科技趋势预测
  15. cuda并行编程之求解ConjugateGradient(共轭梯度迭代)丢失dll解决方式
  16. 关于网页设计工具的50个新的资源和灵感
  17. 【深入理解JS核心技术】13. 什么是高阶函数
  18. C/C++ 大小端转换
  19. js【点击 div 2s 后颜色变成『粉色」】
  20. 阿里 java 面试题 p6_五面阿里P6:Java开发面试题及答案

热门文章

  1. 色彩对比广告设计_为什么我们都需要使用色彩对比检查器
  2. 智课雅思词汇---九、mon是什么意思
  3. vba mysql 80004005_80004005错误,求高手指点,急,谢谢!
  4. Ubuntu18.04添加vim配置
  5. 我爱民科,苍蝇越多越干净?!
  6. 2021年终总结:鲜花怒马少年时,一日看尽长安花
  7. 【校招Verilog快速入门】组合逻辑篇:VL12、4bit超前进位加法器电路
  8. 单反基础知识:光圈和快门
  9. num转大写中文(零壹贰叁肆伍陆柒捌玖)
  10. 苹果cms大橙子和B站模板教程