zoukankan      html  css  js  c++  java
  • 单向散列函数

    之前讨论的问题是:信息保密。(通过加密的方式)

    有时候,我们可能不需要对信息保密,而是希望接收者能够验证在传递过程中的消息有没被修改,即入侵者不能用假消息代替合法消息。(数据完整性)

    一个生活中的问题:如何识别某个人的身份?身份证、指纹。

    对应的,我们有数据指纹

    那么一个指纹函数需要满足什么条件?

    指纹能处理不同人的身份识别

    -》1.该指纹函数要能处理不同长度的数据(甚至是任意长度)

    人的指纹是一个规模相对固定的信息

    -》2.指纹函数的输出长度要固定

    获取一个人的指纹非常容易

    -》3.数据指纹的计算应该比较容易

    已知一个指纹,不能知道指纹是谁(不使用指纹匹配查询的系统)

    -》4.指纹函数的计算具有单向性

    找到两个人的指纹完全一致是不可能的

    -》5.给定一个消息,要找到另外一个消息的指纹与给定消息的指纹一致,是不可能的

    在世界上找到任意两个人指纹完全一样是不可能的

    -》6.找到任意两个指纹一致的消息,是不可能的(包含性质5)

    具有上述性质的指纹函数为单向散列函数

    记为h(x), 具有以下的性质:

    1.h(x)的输入x为任意长度

    2.h(x)的输出长度固定

    3.h(x)的计算方便快捷

    4.h(x)的计算具有单向性

    5.对于给定x, 找到y<>x, 且h(y)=h(x)在计算不可行

    6.找到一对数(x, y), h(x)=h(y)在计算上不可行(包含5)

    这样的函数是满足特殊性质的Hash函数,后文简称Hash函数,产生的输出(消息指纹)称为消息摘要,简称摘要。

    使用Hash函数进行完整性验证的模型:

    Hash函数可以解决口令验证的问题:

    一个用户想进入一个重要的计算机系统,如果计算机存储的是用户的口令,那么就会出现很多问题。问题的关键是,验证口令时,能不能不要知道具体的口令。

    模型:

    不同口令有不同的口令摘要

    只有口令摘要不能恢复口令

    但是这样会有问题,如果攻击者用暴力破解的方法,尝试n个口令,最终能够找到正确的口令,在这个过程中,如果他把口令和对象的口令摘要记录成一个字典,下次破解就只需要查找这个字典就可以了。

    解决的办法是加入一个盐,成为一个含盐口令摘要,盐是一个随机数,在口令设置时预设,且不需要保密。

    不需要保密的原因是:我们必须要盐存起来,以便验证时使用,就有可能泄漏盐,那么就不对盐进行保密了。

    得到的好处:字典攻击失效,对同一口令,盐不同,摘要就不同,字典的空间变得很大,穷举的时间非常长。

    模型变得更加合理:

    在前面的文章,讲过PGP一个安全的邮件系统,它有对私钥文件保密的措施,私钥拥有者是用口令来获取私钥文件的,下面讲下它的工作原理:

    可以看到,其原理是对口令(口令长度任意)进行Hash,输出长度固定的摘要,作为一个key,对私钥文件进行加密时,加入Key,使用对称加密器,得到加密后的私钥文件。

    解密时同样输入一个口令,Hash一下,作为Key进行解密。

    Hash函数解决数字签名的问题:

    如果直接对明文进行数字签名,如果文件很长,签名的时间会很长。

    使用Hash,即使文件很长,Hash后的摘要长度是固定的,签名的时间是个常数,验证签名的时间也是个常数。

    签名过程:

    验证签名过程:

  • 相关阅读:
    require的特点
    require和load的不同之处
    关于“load”方法
    puts方法要点
    用类解释对象的由来
    以方法调用的原理解释Ruby中“puts ‘Hello‘”
    Ruby中方法的设计理念
    Ruby中puts,print,p的区别
    Ubuntu16.04安装MongoDB的Ruby驱动
    使用spring框架,用xml方式进行bean装配出现“The fully qualified name of the bean's class, except if it serves...”
  • 原文地址:https://www.cnblogs.com/13jhzeng/p/5528929.html
Copyright © 2011-2022 走看看