• hash算法


    什么是哈希算法?
    不管是“散列”还是“哈希”,英文都是hash,所以,我们常听到有人把“散列表”叫做“哈希表”。

    哈希算法的定义和原理很简单,基本上一句话就能概括。将任意长度的二进制值串映射为固定长度的二进制值串,这个映射规则就是哈希算法。而通过原始数据映射之后得到的二进制值串就是哈希值。

    设计一个优秀的哈希算法,需要满足以下几点要求:

    1.从哈希值不能反向推倒出原始数据(所以哈希算法也叫单向哈希算法)

    2.对输入数据非常敏感,哪怕原始数据只修改了一个bit,最后得到的哈希值也不相同

    3.散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小

    4。哈希算法的执行效率要尽量高效,针对较长的文本,也能快速地计算出哈希值

    对于哈希算法来说,前两点格外重要。第一点和好理解,加密地目的就是防止原始数据泄露,所以很难通过哈希值反向推倒原始数据,这是一个最基本的要求。

    第二点:实际上,不管是什么哈希算法,只能尽量减少碰撞冲突的概率,理论上是没办法做到完全不冲突的。这里是基于组合数学中一个非常基础的理论,鸽巢原理(也叫抽屉原理),它是说,如果有10个鸽巢,有11只鸽子,那肯定有一个鸽巢中的鸽子数量多于一个,换句话说,肯定有2只鸽子在1个鸽巢里。

    有了鸽巢原理的铺垫,再来看为什么哈希算法无法做到零冲突?

    我们知道,哈希算法产生的哈希值的长度是固定且有限的,比如MD5,哈希值是固定的128位二进制串,能表示的数据是有限的,最多能表示2128个数据,而我们要哈希的数据是无穷的。基于鸽巢原理,如果我们对2128+1个数据求哈希值,就必然回存在哈希值相同的情况。一般情况下,哈希值越长的哈希算法,散列冲突的概率越低。

    实际上,散列函数也是哈希算法的一种应用

    散列函数是设计一个散列表的关键,它直接决定了散列冲突的概率和散列表的性能,不过,相对哈希算法的其他应用,散列函数对于散列算法冲突的要求要低很多,即便出现个别散列冲突,只要不是过于严重,都可以通过开放寻址法或者链表法解决。

    不仅如此,散列函数对于散列算法计算得到的值,是否能反向解密也并不关心。散列函数中用到的散列算法,更加关注散列后的值是否能平均分布,也就是,一组数据是否能均匀地散列在各个槽中。除此之外,散列函数执行地快慢,也会影响散列表地性能,所以,散列函数用的算法一般都比较简单,比较追求效率。

    哈希算法与加密算法##

    Hash算法严格上来说并不属于加密算法,而是与加密算法属于并列关系的一种算法。

    概括来说,哈希(Hash)是将目标文本转换成具有相同长度的、不可逆的杂凑字符串(或叫做消息摘要),而加密(Encrypt)是将目标文本转换成具有不同长度的、可逆的密文。
    因为Hash算法在信息的转化过程中,

    具体来说,两者的主要区别有以下两个:
    1)Hash算法转换过程不可逆,而加密转换过程可逆
    2)Hash算法无论输入的源数据的长度是多少,同一种Hash算法转换后结果的长度都相同。而加密转换后结果的长度一般与源数据的长度正相关。

    关于Hash算法和加解密算法,我们讨论如下几个问题:

    1、为什么Hash算法是不可逆,但是加密算法是可逆的?

    这里的不可逆既指不能根据转换后的结果逆转回原文,也指对于两个输入,即使其转换结果相同也不能说这两个输入就一定相同。
    因为,Hash算法的定义域是一个无限集合,但是值域确是一个有限集合,将一个无限集合映射到有限集合上,根据“鸽笼原理”,每个哈希结果都存在无数个可能的目标文本,因此哈希是一个多对一的映射,所以它也不存在逆映射。

    但是对于加密算法,它的结果往往取决于输入,其定义域和值域都是无限集合,明显是一个一一映射,对于一一映射,理论上都是可逆的。

    2、对于Hash算法和加解密算法一般情况下我们是如何选择的呢

    基本原则是:如果被保护数据仅仅用作比较验证,在以后不需要还原成明文形式,则使用哈希;如果被保护数据在以后需要被还原成明文,则需要使用加密。

    如一般情况下,几乎所有的注册用户时我们输入的密码都是使用Hash算法进行加密然后将其保存在数据库中的。当我们登录时,输入我们的密码,然后通过Hash运算,将运算结果与数据库中存储的结果比较,相同的话就登录,不同的话就代表密码错误,需要重新输入。
    当我们忘记自己的密码需要修改密码时,我们需要使用密保等进行验证,验证成功后需要设置新密码,然后Hash算出新密码的结果,将数据库中的源密码的Hash结果覆盖。而不是我们忘记密码后服务器将我们的原密码给我们重新发送过来,然后我么是原密码进行登录。这是几乎是不可能的,原因就是因为Hash算法是不可逆的。

    而对于使用加解密算法,例子就很多了。比如加密文件,将加密后的数据保存后者发送给他人。别人不知道密码时是无法解密的,只有输入密码后才能将加密后的文件解密出来。

    常见的Hash算法有:MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1等

    部分引自:https://blog.csdn.net/qq_24280381/article/details/72024860

  • 相关阅读:
    学习DButils笔记
    ubuntu16.04 backup and restore
    Oracle 中 编写 function 和 procedure 的注意事项
    利用反射和JDBC元数据实现更加通用的查询方法
    Memcached
    HTML, CSS
    day35作业
    day34作业
    MySQL数据库
    并发编程
  • 原文地址:https://www.cnblogs.com/ymd12103410/p/10008206.html
Copyright © 2020-2023  润新知