- 对于以中心化的中央银行来说需要做到防止篡改功能,那么其中场景就是中央银行控制供给,并加上防伪标识,但是依旧有人伪造,这时候再加上执法机构进行互补,对伪造的人给予一定的惩罚
- 但是分布式没有中心处理中心就要通过密码原理进行防止篡改,于是就有了哈希函数,同时防篡改也是哈希函数最重要的功能
哈希函数
1.特性[1]
1.1三个特性:
-
其输入可为任意大小的字符串。
-
它产生固定大小的输出。为使本章讨论更具体,我们假设输出值大小为256位,但是,我们的讨论适用于任意规模的输出,只要其足够大。
-
它能进行有效计算,简单来说就是对于特定的输入字符串,在合理时间内,我们可以算出哈希函数的输出。更准确地说,对应n位的字符串,其哈希值计算的复杂度为O(n)。
1.2 由于安全附加的几个特性:
-
碰撞阻力(collision-resistance);
-
找不到两个不同的值去映射到同一个值,无法将其产生碰撞,这就是常说的碰撞阻力;
-
图示如下:
-
注意到一个问题就是:虽然说有很多种情况,但是在有一些特殊方法之下就可能使得碰撞几率大大增大,最后完成碰撞;其中计算碰撞的概率有个很经典的理论:
-
生日悖论:
-
定义:某个班级里一共有 23 名学生。不考虑双胞胎、闰年等特殊情况,在这些男孩女孩中间,有 2 个人生日相同的概率是多少?
- 答:实际发生的概率要高达50.7%。
-
悖论所悖之处:
- 直觉上:我们会觉得发生的概念很小,毕竟一年有365天
- 实际上:实际上发生的概念很大,这主要是因为我们直觉和实际客观看待这个事情的出发点是不一样的——所以我们在计算的时候就会相比客观漏掉了很多
- 从我们自身去看,我们需要寻找的是与自己生日相同的人;
- 从客观来看,需要找到的只要是任意两个生日相同的人便是。
-
如何计算同年同月生的概率呢?
- 答: →
-
我们经过总结:
- 一个人的生日一共有365 种可能。我们可以把这个问题写成一般形式,即在有n 种可能的情形下,要使至少有2人生日相同的概率达到50%,需要有如下的样本人数:
- 对应到式子中就是
- (365天就是365种可能):
- (12个月就是12种可能):
- 也就是说,当样本人数大于等于5 时,存在相同出生月份的概率就将超过50%
- 一个人的生日一共有365 种可能。我们可以把这个问题写成一般形式,即在有n 种可能的情形下,要使至少有2人生日相同的概率达到50%,需要有如下的样本人数:
-
实际应用场景:
-
生物识别的精确度:
-
衡量该精度的指标是错误接受率(False Acceptance Rate,简称FAR,也叫认假率)——也就是把他人的、不应该匹配的生物特征信息当成与用户本人匹配的信息。
-
带来的问题:虽然说生物识别精度很高,但是他们的总数实际上是一定的,那么虽然入库的人数不断增加,这就对应到一个班级的人数不断增加,那么自然产生相同的信息的人可能性就会更大,如下图所示:
- 同样我们在DNA鉴定的时候一样会发生这样的事情,遇到同样的困难,并且有时候即使保证了理论上的很大概率不重合,但是我们需要知道概率和频率的区别——也就是即使是再少的概率也是可能发生,
- 需要注意的一点就是:一旦出现DNA相同的事情但是人们认为DNA是不可能相同的话那就是可能导致很大的矛盾
- 可能发生的场景:在美国的马里兰州,截至2007 年1 月,该州的DNA 数据库共收录了大约3 万人的信息。这个数字比256 万整整少了2 位数。但即使这样,实际上该地区也出现了不同人的DNA 被判定为一致的事件20。
- 同样我们在DNA鉴定的时候一样会发生这样的事情,遇到同样的困难,并且有时候即使保证了理论上的很大概率不重合,但是我们需要知道概率和频率的区别——也就是即使是再少的概率也是可能发生,
-
不发生错误的概率公式:
-
-
-
世界上没有哈希函数具有防碰撞特性。我们实践中依赖的加密的哈希函数仅仅是人们经过不懈努力之后暂未成功找到碰撞的函数。
- :最终找到碰撞,使之慢慢在使用中被淘汰
-
作用:
- 当需要下载一个硕大的文件的时候,下载下来如何核对信息是否准备是我们面临的问题
- 答:通过核对hash摘要信息,由于碰撞原理的原因,使得在不发生碰撞的情况下我们不用去核对那硕大的文件,只需要对固定长度的hash信息进行比对就行。
- 当需要下载一个硕大的文件的时候,下载下来如何核对信息是否准备是我们面临的问题
-
-
-
-
隐秘性(hiding);
-
解释:我们仅仅知道hash函数的输出,但是没有一个可行的方法去算出来,也就是相当于把hash函数当成一个小黑盒子;
-
意义:在你知道结果的情况,无法反向求出输入的是什么
-
当其输入 选自一个高阶最小熵(high min-entroy)的概率分布,在给定 条件下来确定 是不可行的。
- 高阶最小熵[2]:
- 很大的时候:
- 如果r是从长度为256位的字符串中随意选出的,那么任意特定字符串被选中的概率为1/2 256 ,这是一个小到几乎可以忽略的取值;
- 让r这个随机变量是通过一个即使在“最保守”的情况下也有“很多”可能性,高度混乱,高度随机的系统中选取。
- 很小的时候:当我们进行设置密码的时候,通常设置自己生日相关这样会比较好记
- 很大的时候:
- 高阶最小熵[2]:
-
实现:
-
承诺:
-
算法实现:
-
要求的特性:
- 隐秘性:已知
,没有可行的方法找到
。——同时也是这一小节所需要给的定义在这里总结出来。
- 定义:当其输入 选自一个高阶最小熵(high min-entroy)的概率分布,在给定 条件下来确定是不 可行的。
- 更像是平时我们需要中间人,只有通过中间人才能得到相应的信息,别人即使知道你承诺了这个东西,但是具体却不知道承诺的内容;
- 约束性:没有可行的办法找到两组
和
,
,而
。
- 对于所承诺的东西,这里面的信息你是不能找到其他信息去替代他的;
- 隐秘性:已知
,没有可行的方法找到
。——同时也是这一小节所需要给的定义在这里总结出来。
-
具体实施:
- 承诺的隐蔽性正好是hash的隐蔽性;
- 承诺的约束性也正好与hash的碰撞对应;
- 所以结合1和2,我们正好把hash函数作为承诺的实现
-
-
-
-
谜题友好(puzzle-friendliness):区块链中尤其需要,但是其他哈希函数使用到的场景却不一定需要
- 定义:
- 如果对于任意 位输出值 ,假定k选自高阶最小熵分布,如果无法找到一个可行的方法,在比 小很多时间内找到 ,保证 成立,那么我们称哈希函数 为谜题友好;
- 集合Y并不是固定的,而是在一个集合范围,所以需要考虑的是这个集合的个数。由于输出是一个集合,那么只要找到其中一个就可以解决问题,但是如果这个集合是最小集合于是就变成需要遍历 个值。
- 解释:
- 如果有一个人想找到y值所对应的输入,假定在输入集合中,有一部分是非常随机的,那么他将非常难以求得y值对应的输入。
- 与隐秘性的区别:隐秘性是针对于输入输出的单个x、y,而谜题友好是针对于输入输出的集合来说的。
- 区块链应用这一特性在挖矿中。
- 定义:
2.哈希函数在区块链中的应用[3]
比特币中大量使用 (Secure Hash Algorithm 256)哈希函数,并且效果还很好。
为了让hash函数能够接受各个长度的数字的方法:通过一般方法,就可以将接受固定长度的哈希函数转化为可接受任意长度输入的哈希函数,我们称这个转换过程为 (Merkle-Damgard)变换,过程如下图所示:
首先将信息分为多个区块,每段区块等长(不够长度的可以在最开始前面补0),利用初始向量依次与所分区块进行计算得到固定长度数,每次将上一次计算结果加入本次计算中并与信息区块进行计算。通过这样的一系列计算使得无论多长的数都能得到固定长度的数目——也就是用时间的代价最后换来固定长度的摘要。
注意:
- 需要注意的是并不是前面所讲的hash函数特性在每一个应用场景都会使用到,都是有选择性的使用。比如:第三个特性谜题友好一般就只是在区块链中使用。
2.1 hash指针及其结构
hash指针与普通指针的区别:
- hash指针指向数据存储位置及其位置数据的哈希值的指针,不仅有位置指向而且还能保证没有被篡改过。
- 注意: 表示有位置的指向并且防篡改,就相当于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节点(藕粉色框)的哈希
-
图示:
-
-
所以如果整棵树上有 个节点,只需要展示约 个项目,因为每个步骤仅需要计算子区块的哈希值,验证过程需要时间约为 。——我们可以从上图看到每次验证只需要知道同层次未知相邻的部分就行
参考文章
1.生日悖论
3.解读区块链全套六册.第四章.第四节