密码学入门(5):单向散列函数

文章目录

  • 密码学入门(5):单向散列函数
    • 什么是单向散列函数
    • 单向散列函数的性质
    • MD4、MD5
    • SHA家族
    • 暴力破解
    • 生日攻击
    • 应该使用那种单向散列函数
    • 参考

在开始之前,我们先假设一个场景:我们现在想下载一个ubuntu的镜像文件,如何确保我们下载的文件是和原始文件一模一样的呢?下载的过程中可能会因为网络原因,或者其他可能的原因,导致下载的镜像文件不完整,即使是111个bit的不同。

其实,我们可能已经接触过单向散列函数了。在下载镜像文件时,在下载页面可能会看到md5、sha256之类的字眼,后面跟了一堆数字和字母的序列。例如:

这里的f8d3ab0faeaecb5d26628ae1aa21c9a13e0a242c381aa08157db8624d574b830就是单向散列函数生成的散列值。通过计算下载的镜像文件的散列值,再和这串散列值对比,就可以验证文件是否完整了。这是单向散列函数的一个应用。

什么是单向散列函数

单向散列函数(one-way hash function)有一个输入和一个输出,其中输入称为消息(message),输出称为散列值(hash value)。它可以根据消息的内容计算出散列值,而散列值可以用来检查消息的完整性。

单向散列函数的相关术语有很多变体,例如:

  • 单向散列函数也称为消息摘要函数(message digest function)、哈希函数或杂凑函数。
  • 输入单向散列函数的消息也称为原像(pre-image)。
  • 单向散列函数输出的散列值也称为消息摘要(message digest)或者指纹(fingerprint)。
  • 完整性也称为一致性

单向散列函数除了上面说的可以用来验证文件的完整性,还可以用于构造消息认证码、数字签名、构造伪随机数生成器等。

单向散列函数无法解决的问题:单向散列函数能够辨别出“篡改”,但无法辨别出“伪装”。即只能保证消息的完整性,不能对消息进行认证。用于认证的技术包括消息认证码数字签名,我们将在之后讨论。

单向散列函数的性质

  • 根据任意长度的消息计算出固定长度的散列值:无论输入多长的消息(111字节、111MB、111GB、111TB或更大),输出的散列值都是固定长度(例如sha256是256256256bit)。
  • 能够快速计算出散列值。
  • 具备单向性:根据消息计算散列值很容易,但根据散列值计算消息很困难。
  • 消息不同散列值也不同:消息中哪怕只有111比特的改变,也必须有很高的概率产生不同的散列值。
  • 抗碰撞性:两个不同的消息产生同一个散列值的情况称为碰撞(collision)。难以发现碰撞的性质称为抗碰撞性(collision resistance)。
  • 雪崩效应:当输入发生最微小的改变(例如,反转一个二进制位)时,也会导致输出的不可区分性改变(输出中每个二进制位有50%的概率发生反转):

MD4、MD5

  • MD4是由Rivest于1990年设计的单向散列函数,能够产生128128128比特的散列值。现在已经不安全了。
  • MD5是由Rivest于1991年设计的单向散列函数,能够产生128128128比特的散列值。现在也不安全了。
  • MD4和MD5中的MD是消息摘要(Message Digest)的缩写。

SHA家族

  • SHA-1于1995年发布,是由NIST(National Institute of Standards and Technology)设计的一种能产生160160160比特的散列值的单向散列函数,是MD5的后继者。现在已经被攻破了。
  • SHA-2于2001年发布,包括SHA-256、SHA-384、SHA-512等,散列值长度分别为256256256比特、384384384比特和512512512比特。这些单向散列函数合起来统称SHA-2。SHA-2目前没有出现明显的弱点。
  • SHA-3与2015年发布,由于对MD5成功的破解,以及对SHA-0和SHA-1出现理论上破解的方法,NIST感觉需要一个与之前算法不同的,可替换的加密散列算法,也就是现在的SHA-3。SHA-3和AES一样采用公开竞争的方式进行标准化,最后一个名叫Keccak的算法胜出,最终成为了SHA-3。

暴力破解

假设有一条消息,经过SHA-512计算后的到散列值,由于散列值长度为512512512比特,根据鸽巢原理,我们最多只需要尝试25122^{512}2512次就能找到一条和原消息不同但散列值相同的消息,但如此多的尝试次数在现实中是不可能完成的。

由于尝试次数纯粹是由散列值的长度决定的,因此散列值长度越长,抵御暴力破解的能力也就越强。

生日攻击

生日攻击(birthday attack)与暴力破解的不同之处在于,生日攻击不是寻找生成特定散列值的消息,而是要找到散列值相同的两条消息,其中散列值可以是任意值。

假设一个班上有303030名学生,问至少一名学生和另外任意一名学生有着相同生日的概率是多少?

从直觉上看概率貌似很小,但实际上概率大约为70.63%70.63\%70.63%。

为了计算这个概率,我们可以先计算每个人生日不一样的概率P′P'P′,然后用1−P′1 - P'1−P′就能得到“至少一名学生和另外任意一名学生有着相同生日的概率”:

P′=365365×364365×363365×...×365−30+1365=365×364×363×...×(365−30+1)35630≈29.37%P=1−P′≈70.63%\begin{aligned} P' &= \frac {365} {365} \times \frac {364} {365} \times \frac {363} {365} \times ...\, \times \frac {365 - 30 + 1} {365} \\ &= \frac {365 \times 364 \times 363 \times ...\, \times (365 - 30 + 1)} {356^{30}} \\ &\approx 29.37\% \\ P &= 1 - P'\approx 70.63\% \end{aligned} P′P​=365365​×365364​×365363​×...×365365−30+1​=35630365×364×363×...×(365−30+1)​≈29.37%=1−P′≈70.63%​

实际上,假设一年有YYY天,那么NNN人的集合中,至少有两个人生日一样的概率大于50%50\%50%,NNN至少为Y\sqrt YY​,即Y12Y^\frac 1 2Y21​。

对于512512512比特的散列值来说,YYY为25122^{512}2512,因此对同一单向散列函数进行生日攻击需要的次数为2512=2256\sqrt {2^{512}} = 2^{256}2512​=2256次,比暴力破解所需的攻击次数少得多。

应该使用那种单向散列函数

  • MD5是不安全的,不应该使用。
  • SHA-1除了用于对过去生成的散列值进行校验之外,不应被用于新的用途。
  • SHA-2有效应对了针对SHA-1的攻击方法,因此是安全的,可以使用。
  • SHA-3是安全的,可以使用。
  • 和对成密码算法一样,我们不应该使用任何自制算法

参考

  • 《图解密码技术》
  • https://zh.wikipedia.org/wiki/雪崩效应
  • https://zh.wikipedia.org/wiki/SHA家族
  • https://zh.wikipedia.org/wiki/生日攻击

密码学入门(5):单向散列函数相关推荐

  1. 【学习笔记】密码学入门(2) 单向散列函数,消息认证码,数字签名,证书

    [学习笔记]密码学入门(2) 单向散列函数,消息认证码,数字签名,证书 学习笔记 2 – 混合密码系统 在密码学入门(1)中提到了基本的密码形式,对称密码和公钥密码以及混合密码系统. 这一部分将学习到 ...

  2. 网络协议从入门到底层原理(7)网络安全 - 常见攻击、单向散列函数、对称加密、非对称加密、混合密码系统、数字签名、证书

    网络安全 网络层 - ARP欺骗 DoS.DDoS 介绍与防御 传输层 - SYN洪水攻击(SYN flooding attack) 传输层 - LAND攻击 应用层 - DNS劫持.HTTP劫持 H ...

  3. 密码学专题 相关概念的解析 对称算法|算法的安全性|非对称算法存在的问题|单向散列函数|数字签名的弊端|密钥交换

    对称加密算法 对称加密算法又可以分成流加密算法和块加密 算法. 流加密算法又称为序列加密算法或序列密码,它每次只对明文中的单个位或单个字节 进行加密操作.这种算法的优点是能够实时进行数据传输和解密,缺 ...

  4. 豆瓣评分9.4,跪着推荐这本密码学入门第一书

    "密码"这个词,总是让人难以捉摸,有时候你认为它很简单,其实它却包含着几种看似差不多但本质上却完全不同的含义,还真是不简单. 那么"密码"到底是什么呢?它其实是 ...

  5. 密码学入门(6):消息认证码

    密码学入门(6):消息认证码 文章目录 密码学入门(6):消息认证码 什么是消息认证码? 消息认证码的实现方式 HMAC 认证加密 重放攻击 防御重放攻击的方式 消息认证码无法解决的问题 参考 上次讲 ...

  6. 【网络信息安全】密码学入门笔记

    密码学入门 主要内容与重点 一.传统密码学 二.现代密码学 三.理论不可破解和计算不可破解的加密算法 密码系统的基本要求和设计原则 一次一密密码系统 一次一密码系统的算法 一次一密密码系统举例 无法破 ...

  7. 消息认证码和单向散列函数

    因为在上一部分没有解释这两个概念,所以在这里详细解释一下 消息验证码和单向散列函数是进行消息身份验证的两个方法 而且他俩都属于"没有消息加密的消息身份验证" 消息认证码(MAC) ...

  8. golang单向散列函数

    概念 称谓: 单向散列函数, 哈希函数, 杂凑函数, 消息摘要函数 接收的输入: 原像 输出: 散列值, 哈希值, 指纹, 摘要 单向散列函数特性 将任意长度的数据转换成固定长度的数据 很强的抗碰撞性 ...

  9. 认证篇——单向散列函数

    目录 一.单向散列函数简介 单向散列函数的性质: 二.单向散列函数的应用: 三.单向散列函数种类: 1)MD4.MD5 2)SHA(安全散列算法) 3)RIPEMD-160 单向散列函数SHA-1介绍 ...

  10. 趣味密码学入门--cryptohack

    趣味密码学入门–cryptohack 前言 Awesome CTF中发现了一个有趣的密码学挑战平台–cryptohack,小白的我通过做题来学习密码学知识吧 cryptohack平台官网:https: ...

最新文章

  1. 微软Cortana全面升级神经网络语音,效果堪比真人发音
  2. blfs(systemd版本)学习笔记-配置远程访问和管理lfs系统
  3. 十年硬件老司机,结合实际案例,带你探索单片机低功耗设计!
  4. OpenVINO 2019 R2.0 Custom Layer Implementation for linux(1)
  5. linux java mail 时间,Javamail在Windows上工作,而不是在Linux上
  6. google protobuf使用
  7. VisualStudio2005技巧集合--打造自己的CodeSnippet
  8. AI金融知识自学偏量化方向-了解不同类型的机器学习2
  9. idea运行android usb调试,IntelliJ IDEA
  10. vue 设置div圆角,只设置上面两个圆角,下面两个还是正方形
  11. c专家编程(C专家编程pdf)
  12. 在Windows使用mingw32编译opencv
  13. Hadoop和Hbase版本选择
  14. 什么是SAP Analytics Cloud
  15. iOS苹果超级签苹果分发平台企鹅:422903005
  16. C#网络编程 (二) 数据流的类型和应用
  17. 极米NEW Z6X和坚果G9哪个好?
  18. 计算机网络教学方式探讨论文,高职计算机网络安全课程教学改革探讨
  19. N9H30 FMI NAND controller driver for RTT
  20. 测试画面帧率及帧延时一种方法

热门文章

  1. mac版 IGV(版本2.12.3)安装
  2. 计算机界面无法全部显示,电脑屏幕不能完整显示软件界面怎么处理
  3. C语言代码简化技巧(一)
  4. isSucess = result == sucess_signal
  5. 用delete带where条件删除特定行部分列(属性)的数据,可能活在梦里
  6. Python实现飞机大战
  7. 台式计算机网线接口松动怎么办,台式电脑网卡坏了怎么修复(图文)
  8. Tenacity——Exception Retry 从此无比简单
  9. CGB2202API基础第1天
  10. SQL Server医疗信息管理系统数据库【英文版-源码】--(Medical Management System Database)