密码学入门(5):单向散列函数
密码学入门(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):单向散列函数相关推荐
- 【学习笔记】密码学入门(2) 单向散列函数,消息认证码,数字签名,证书
[学习笔记]密码学入门(2) 单向散列函数,消息认证码,数字签名,证书 学习笔记 2 – 混合密码系统 在密码学入门(1)中提到了基本的密码形式,对称密码和公钥密码以及混合密码系统. 这一部分将学习到 ...
- 网络协议从入门到底层原理(7)网络安全 - 常见攻击、单向散列函数、对称加密、非对称加密、混合密码系统、数字签名、证书
网络安全 网络层 - ARP欺骗 DoS.DDoS 介绍与防御 传输层 - SYN洪水攻击(SYN flooding attack) 传输层 - LAND攻击 应用层 - DNS劫持.HTTP劫持 H ...
- 密码学专题 相关概念的解析 对称算法|算法的安全性|非对称算法存在的问题|单向散列函数|数字签名的弊端|密钥交换
对称加密算法 对称加密算法又可以分成流加密算法和块加密 算法. 流加密算法又称为序列加密算法或序列密码,它每次只对明文中的单个位或单个字节 进行加密操作.这种算法的优点是能够实时进行数据传输和解密,缺 ...
- 豆瓣评分9.4,跪着推荐这本密码学入门第一书
"密码"这个词,总是让人难以捉摸,有时候你认为它很简单,其实它却包含着几种看似差不多但本质上却完全不同的含义,还真是不简单. 那么"密码"到底是什么呢?它其实是 ...
- 密码学入门(6):消息认证码
密码学入门(6):消息认证码 文章目录 密码学入门(6):消息认证码 什么是消息认证码? 消息认证码的实现方式 HMAC 认证加密 重放攻击 防御重放攻击的方式 消息认证码无法解决的问题 参考 上次讲 ...
- 【网络信息安全】密码学入门笔记
密码学入门 主要内容与重点 一.传统密码学 二.现代密码学 三.理论不可破解和计算不可破解的加密算法 密码系统的基本要求和设计原则 一次一密密码系统 一次一密码系统的算法 一次一密密码系统举例 无法破 ...
- 消息认证码和单向散列函数
因为在上一部分没有解释这两个概念,所以在这里详细解释一下 消息验证码和单向散列函数是进行消息身份验证的两个方法 而且他俩都属于"没有消息加密的消息身份验证" 消息认证码(MAC) ...
- golang单向散列函数
概念 称谓: 单向散列函数, 哈希函数, 杂凑函数, 消息摘要函数 接收的输入: 原像 输出: 散列值, 哈希值, 指纹, 摘要 单向散列函数特性 将任意长度的数据转换成固定长度的数据 很强的抗碰撞性 ...
- 认证篇——单向散列函数
目录 一.单向散列函数简介 单向散列函数的性质: 二.单向散列函数的应用: 三.单向散列函数种类: 1)MD4.MD5 2)SHA(安全散列算法) 3)RIPEMD-160 单向散列函数SHA-1介绍 ...
- 趣味密码学入门--cryptohack
趣味密码学入门–cryptohack 前言 Awesome CTF中发现了一个有趣的密码学挑战平台–cryptohack,小白的我通过做题来学习密码学知识吧 cryptohack平台官网:https: ...
最新文章
- 微软Cortana全面升级神经网络语音,效果堪比真人发音
- blfs(systemd版本)学习笔记-配置远程访问和管理lfs系统
- 十年硬件老司机,结合实际案例,带你探索单片机低功耗设计!
- OpenVINO 2019 R2.0 Custom Layer Implementation for linux(1)
- linux java mail 时间,Javamail在Windows上工作,而不是在Linux上
- google protobuf使用
- VisualStudio2005技巧集合--打造自己的CodeSnippet
- AI金融知识自学偏量化方向-了解不同类型的机器学习2
- idea运行android usb调试,IntelliJ IDEA
- vue 设置div圆角,只设置上面两个圆角,下面两个还是正方形
- c专家编程(C专家编程pdf)
- 在Windows使用mingw32编译opencv
- Hadoop和Hbase版本选择
- 什么是SAP Analytics Cloud
- iOS苹果超级签苹果分发平台企鹅:422903005
- C#网络编程 (二) 数据流的类型和应用
- 极米NEW Z6X和坚果G9哪个好?
- 计算机网络教学方式探讨论文,高职计算机网络安全课程教学改革探讨
- N9H30 FMI NAND controller driver for RTT
- 测试画面帧率及帧延时一种方法
热门文章
- mac版 IGV(版本2.12.3)安装
- 计算机界面无法全部显示,电脑屏幕不能完整显示软件界面怎么处理
- C语言代码简化技巧(一)
- isSucess = result == sucess_signal
- 用delete带where条件删除特定行部分列(属性)的数据,可能活在梦里
- Python实现飞机大战
- 台式计算机网线接口松动怎么办,台式电脑网卡坏了怎么修复(图文)
- Tenacity——Exception Retry 从此无比简单
- CGB2202API基础第1天
- SQL Server医疗信息管理系统数据库【英文版-源码】--(Medical Management System Database)