密码学 哈希函数个人学习总结

Hash函数

  • Hash函数性质
  • Hash函数的作用
  • HASH的常用算法
  • 常见破解密码的方法

hash函数又叫作 摘要算法,通常又称为 单向散列函数,理论上是不可逆的。
hash函数是一种通过算法将一段任意的输入转化成一个固定长度(通常是128个二进制位,32个十六进制字符)的输出的形式.它又被称为信息指纹;当数据发生变化时,指纹也会发生变化。

Hash函数性质

  1. 算法公开,散列的算法是公开的,也就是说谁都可以通过算法进行输入散列化.
  2. 信息指纹,对相同的输入信息进行散列,得到的结果是一致的.(这也是信息指纹的由来)
  3. 不可逆.(将一个已经被散列的输出无法通过计算还原原本的输入)
    tag:但是现在也有网上通过大数据收集已有的散列,进行库存储,可以通过查库得到原本的输入.
  4. 定长,对不同长度的输入信息进行散列,得到的输出永远是定长的(128个二进制位,32个十六进制字符).
  5. 无冲突:当你知道x,无法求出一个y, 使x与y的HASH值相同。
  • 具体特性描述如下

    (1)原始密码经哈希函数计算后得到一个哈希值

    (2)改变原始密码,哈希函数计算出的哈希值也会相应改变

    (3) 同样的密码,哈希值也是相同的

    (4) 哈希函数是单向、不可逆的。也就是说从哈希值,你无法推算出原始的密码是多少

  • 为了保证哈希函数在密码学上的安全性,必须满足以下3个条件

    1)抗冲突(collision-resistance)。简单来说,哈希函数抗冲突指的是不同的输入不能产生相同的输出。
    抗冲突并不是说不会有冲突,只不过找到有冲突的两个输入的代价很大,不可承受。这就好像暴力破解一个有效期为20年的密码,整个破解过程长达30年,虽然最后密码被破解了,但是由于密码有效期过了,所以也就失去了意义。

    2)信息隐藏(information hiding)。这个特性是指如果知道了哈希函数的输出,不可能逆向推导出输入。

    3)可隐匿性(puzzle friendly)。如果有人希望哈希函数的输出是一个特定的值(意味着有人事先知道了哈希函数的输出结果),只要输入的部分足够随机,在足够合理的时间内都将不可能破解。这个特性主要是为了对付伪造和仿制。

    比较常用的有:MD5和SHA。

Hash函数的作用

  • 在密码学中,hash算法的作用主要是用于消息摘要和签名,换句话说,它主要用于对整个消息的完整性进行校验。
  1. 搜索引擎.
    在搜索引擎中,搜索引擎会进行猜词搜索,就是取搜索词汇中的关键字进行hash匹配,如果匹配结果一致,就显示相应的搜索结果.

  2. 文件签名
    文件内容很多,将文件内容通过HASH函数处理后得到一个HASH值,验证这个文件是否被修改过,只需要把文件内容用同样的HASH函数处理后得到HASH值再比对和文件一起传送的HASH值即可,如不公开HASH算法,那么信道是无法篡改文件内容的时候篡改文件HASH值,一般应用的时候,HASH算法是公开的,这时候会用一个非对称加密算法加密一下这个HASH值,这样即便能够计算HASH值,但没有加密密钥依然无法篡改加密后HASH值。这种算法用途很广泛,用在电子签名中。HASH算法也可进行破解,这种破解不是传统意义上的解密,而是按照已有的HASH值构造出能够计算出相同HASH值的其他原文,从而妨碍原文的不可篡改性的验证,俗称找碰撞。这种碰撞对现有的电子签名危害并不严重,主要是要能够构造出有意义的原文才有价值,否则就是构造了一个完全不可识别的原文罢了,接收系统要么无法处理报错,要么人工处理的时候发现完全不可读。

  3. 对于用户敏感信息的保密(比如用户密码)
    HASH算法的另外一个很广泛的用途,就是很多程序员都会使用的在数据库中保存用户密码的算法,通常不会直接保存用户密码(这样DBA就能看到用户密码啦,好危险啊),而是保存密码的HASH值,验证的时候,用相同的HASH函数计算用户输入的密码得到计算HASH值然后比对数据库中存储的HASH值是否一致,从而完成验证。由于用户的密码的一样的可能性是很高的,防止DBA猜测用户密码,我们还会用一种俗称“撒盐”的过程,就是计算密码的HASH值之前,把密码和另外一个会比较发散的数据拼接,通常我们会用用户创建时间的毫秒部分。这样计算的HASH值不大会都是一样的,会很发散。

  4. 版权维护
    将正版的文件进行hash存储作为正版标识.当有用户进行文件上传时,检测文件的hash值与库中的hash进行匹配,如果不一致,则是侵权行为

HASH的常用算法

  • MD5
    MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。基本方式为求余、取余、调整长度、与链接变量进行循环运算,得出结果。 MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。MD5算法曾被广泛使用,然而目前该算法已被证明是一种不安全的算法。王晓云教授已经于2004年破解了MD5算法。

  • SHA1
    SHA1在许多安全协议中广为使用,包括TLS和SSL。2017年2月,Google宣布已攻破了SHA1,并准备在其Chrome浏览器产品中逐渐降低SHA1证书的安全指数,逐步停止对使用SHA1哈希算法证书的支持。

  • SHA2
    这是SHA算法家族的第二代,支持了更长的摘要信息输出,主要有SHA224、SHA256、SHA384和SHA512,数字后缀表示它们生成的哈希摘要结果长度。

  • SHA3
    看名称就知道,这是SHA算法家族的第三代,之前名为Keccak算法,SHA3并不是要取代SHA2,因为目前SHA2并没有出现明显的弱点。

  • RIPEMD-160(RACE Integrity Primitives Evaluation Message Digest160)
    RIPEMD160是一个160位加密哈希函数。它旨在替代128位哈希函数MD4、MD5和RIPEMD-128。

  • HMAC加密
    HMAC:给定一个密钥,对明文加密,做两次“散列”,得到的结果还是32为字符串。在实际开发中,密钥是服务器生成,客户端发送请求会拿到KEY。一个账号对应一个KEY

    • 以注册为例:当用户把账号提交给服务器,服务器会验证账号的合法性,如果合法就会生成个KEY给客户端(这个KEY只有在注册的时候会出现一次,一个账号只对应一个KEY);客户端会用拿到的KEY给密码用HMAC方式加密(32位字符串)发给服务器,最终服务器会保存这个HMAC密码。这样就注册成功了!以后再登录就会服务器就会比对这个HMAC密码是否相等决定能否登录成功。

这几种流行的算法,它们最重要的一点区别就是“强抗碰撞性”。

常见破解密码的方法

  1. 最简单、常见的破解方式当属字典破解(Dictionary Attack)和暴力破解(Brute Force Attack)方式。这两种方法说白了就是猜密码。

  2. 字典破解和暴力破解都是效率比较低的破解方式。如果你知道了数据库中密码的哈希值,你就可以采用一种更高效的破解方式,查表法(Lookup Tables)。还有一些方法,比如逆向查表法(Reverse Lookup Tables)、彩虹表(Rainbow Tables)等,都和查表法大同小异。

  • 查表法不像字典破解和暴力破解那样猜密码,它首先将一些比较常用的密码的哈希值算好,然后建立一张表,当然密码越多,这张表就越大。当你知道某个密码的哈希值时,你只需要在你建立好的表中查找该哈希值,如果找到了,你就知道对应的密码了。

  • 为密码加盐(Salt)
    从上面的查表法可以看出,即便是将原始密码加密后的哈希值存储在数据库中依然是不够安全的。那么有什么好的办法来解决这个问题呢?答案是加盐。

  • 盐(Salt)是什么?就是一个随机生成的字符串。我们将盐与原始密码连接(concat)在一起(放在前面或后面都可以),然后将concat后的字符串加密。采用这种方式加密密码,查表法就不灵了(因为盐是随机生成的)。

参考原文链接:
https://blog.csdn.net/yangxingpa/article/details/82632808

你可能感兴趣的:(密码学)