HASH中的MD5

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HASH中的MD5相关的知识,希望对你有一定的参考价值。

参考技术A

Hash,一般翻译做"散列”,也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值.
简单的说就是一种将任意长度的消息压缩到某一固定长度的信息摘要的函数.
HASH主要用于信息安全领域中加密算法,他把一些不同长度的信息转化成杂乱的128位的编码里,叫做HASH值. 也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系.
Hash算法在信息安全方面的应用主要体现在以下的3个方面:

如果将哈希后的密文比作一把锁,暴力破解的方法就是现场制作各种各样不同齿形的钥匙,再来尝试能否开锁,这样耗时无疑很长;我以前错误理解的“彩虹表”,是事先制作好所有齿形的钥匙,全部拿过来尝试开锁,这样虽然省去了制作钥匙的时间,但是后来发现这些钥匙实在是太多了,没法全部带在身上。而真正的彩虹表,是将钥匙按照某种规律进行分组,每组钥匙中只需要带最有特点的一个,当发现某个“特征钥匙”差一点就能开锁了,则当场对该钥匙进行简单的打磨,直到能开锁为止。这种方法是既省力又省时的.

哈希碰撞就是一种优化过算法,其基本原理就是把密码明文对应的MD5与你的MD5进行对比,因为经过一些优化,所以无论是时间上,还是空间都很很快.其优化方法我也没研究过,不过感兴趣的可以查一下王小云教授关于哈希碰撞的论文.

目前来说,破解MD5加密的最有效的方法就是 哈希碰撞+彩虹表+对应秘钥 ,一些网络黑客会在一些明文存储用户密码的网站上窃取信息,假如黑客有一亿条数据,因为都是真实用户所以经过哈希碰撞之后,你的密码被破译出来的几率就真的非常大了,那破译不出来的可能就是因为大小写和一些特殊符号,这就用到了彩虹表,最后就是你的秘钥,比如你是之前对用户的密码进行加盐,还是之后对MD5之后的字符串进行的特殊处理,只要对方知道你的秘钥,那么你密码被破译出来的几率就非常非常高了,所以我们说: 一个密码系统的安全性只在于密钥的保密性,而不在于算法的保密性.

MD5本身是不可逆和无冲突的,但是用一些巧妙地方法会被破解出来.一个密码系统的是没有绝对安全的,密码系统只是增加了被破解的代价.

PS:一切明文存储用户密码的网站都是耍流氓!

什么?区块链中的hash算法!施主,快扶老衲起来



hash算法有很多种。比如MD5、SHA1、SH2(SHA224、SHA256、SHA384和SHA512)、SH3、RIPEMD-160。


这些算法理论上都是不可逆的。但MD5算法被王晓云教授于2004年破解,所以它不是安全的。SHA1也被谷歌于2017年破解了,所以也是不安全的。


hash的本质:输入一个不定的字符串,然后输出一个固定长度的值。这个值就是该字符串的hash值。


hash算法除了上面列举的,还有很多种。在一些不是为了加密的,而仅仅是为了获取一个摘要值的场景,那些被破解的算法或者更快速的hash算法都是不错的选择,具体情况具体分析。


区块链中的哈希算法


有句名言:加密算法是区块链的骨骼。


而hash算法则是区块链中用到最多的加密算法。



总之hash算法是贯穿了区块链系统的方方面面。


什么?区块链中的hash算法!施主,快扶老衲起来


1、区块hash


区块hash指的是对一个区块的区块头进行hash,得到的hash值就是该区块的身份证号,也就是该区块的ID,该值是一个唯一确定的值。


而区块链的区块之间的串联就是通过每个区块的hash值来关联的,然后他们形成一个很长很长的链表结构,这也就是所谓的区块链。


假设现在有一个10000个区块组成的区块链。如果某个人起了歹心修改了第五十个区块。此时该区块的区块头的hash就发生了改变,这时候50号区块就无法和51号进行关联,对不上号了。你会发现要想改变区块链中的数据,你得把所有的区块的所有的hash重新计算一遍。如果区块链足够长,你篡改所有的区块链的代价是非常之大的,甚至是不可能的(这里说的比较谨慎和谦虚)。


相关阅读:、、、、。


2、merkle树


听到merkle你是不是有点头大。不用管。其实很简单。假如一个区块中有很多笔的交易数据。如果你对整个的交易集合进行hash是不是有点怪怪的。可不可以先计算每一笔交易的hash值,然后再两两合并计算hash,一直递归最后算出一个最终的hash值。这个就是merkle hash。最终的hash值就是多笔交易的集合的hash值,也叫merkle root。


下面画个merkle树:


什么?区块链中的hash算法!施主,快扶老衲起来


通过这种层层相扣的计算hash,让你不仅可以知道数据是否被篡改,甚至还能知道哪个具体的交易被篡改。


我们在之前的《》其实就是已经提到过merkle算法,并且还贴出来代码,这里再贴一遍:



这会你也许会说这个merkle树就这么点作用啊。别急,它很厉害的。你发现没,merkle树是一个二叉树。这种树结构在数据校验时会帮我们更快的校验数据。


你知道比特币是一个分布式的网络结构。当一个节点要想同步账本数据时,比如A节点和B节点取得了联系,A从B处同步数据,那么同步过来的数据是不是要校验?


校验时发现同步过来的数据的merkle root和B的不一致。此时就会按照树的方式一层层的去检查,看具体的哪些交易数据被破坏了,检查出来后,只需要下载那些不一致的交易事务就是了。


你会发现,通过这个merkle二叉树,让我们很快地就检索到了有问题的交易事务,这正是树的魅力啊。





相关阅读:

以上是关于HASH中的MD5的主要内容,如果未能解决你的问题,请参考以下文章

文件校验

python中的md5加密

C# 中的 MD5 哈希与动作脚本中的 MD5 哈希不匹配

优化 MySQL 中的 hash 搜索

模块使用(md5加密StringIOJSON)

hashlib 模块用来进行hash