二、单向散列函数(One-way hash function)
- 2.1、单向散列函数的简单介绍
单向散列函数,可以根据根据消息内容计算出散列值。散列值的长度和消息的长度无关,无论消息是1bit、10M、100G,单向散列函数都会计算出固定长度的散列值。
2.2、单向散列函数的特点
- 根据任意长度的消息,计算出固定长度的散列值
- 计算速度快,能快速计算出散列值
- 消息不同,散列值也不同
具备单向性
- 2.3、单向散列函数的分类单向散列函数,又被称为消息摘要函数(message digest function),哈希函数输出的散列值,也被称为消息摘要(message digest)、指纹(fingerprint)
- 常见的几种单向散列函数
- MD4、MD5
产生128bit的散列值,MD就是Message Digest的缩写,目前已经不安全
Mac终端上默认可以使用md5命令 - SHA-1
产生160bit的散列值,目前已经不安全 - SHA-2
SHA-256、SHA-384、SHA-512,散列值长度分别是256bit、384bit、512bit - SHA-3 全新标准
- 2.4、如何防止数据被篡改
对文件进行 单向散列值获取,然后进行对比单向散列值是否一样
2.5、单向散列函数的应用 – 防止数据被篡改
- 防止文件被修改
查看下载的文件是否是正版,如 https://www.realvnc.com/en/connect/download/vnc/
口令加密:服务器只存储用户密码的 单向散列函数的值
,保证安全
2.6、想象以下场景,我们如何验证信息来源的正确性
- Alice发的内容有可能是被篡改的,或者有人伪装成Alice发消息,或者就是Alice发的,但她可以否认
问题来了:Bob如何确定这段消息的真实性?如何识别篡改、伪装、否认?
解决方案:数字签名
三、数字签名
- 3.1、数字签名
- 在数字签名技术中,有以下2种行为
生成签名
:由消息的发送者
完成,通过签名密钥
生成验证签名
:由消息的接收者
完成,通过验证密钥
验证
- 如何能保证这个签名是消息发送者自己签的?
答案:用消息发送者的私钥进行签名,接收者用工要进行验证签名
- 3.2、数字签名和公钥密码
数字签名,其实就是将公钥密码
反过来使用
3.3、数字签名的过程
这样会有一个问题:对内容签名会增加其传输内容的大小,后面会做出改进的方案
3.4、数字签名的过程 – 改进
对发送的内容的单向散列函数值进行一个 数字签名,接收者只需要对内容做一个散列值的对比即可
- 3.4、数字签名 – 疑惑
- 如果有人篡改了文件内容或者签名内容,会是什么结果?
答:签名验证失败,证明内容会篡改 - 数字签名不能保证机密性?
答:数字签名的作用不是为了保证机密性,仅仅是为了能够识别内容有没有被篡改 - 数字签名的作用
答:确认消息的完整性、识别消息是否被篡改、防止消息发送人否认
- 3.5、数字签名无法解决的问题
- 要正确使用签名,前提是
用于验证签名的公钥必须属于真正的发送者 - 如果遭遇了中间人攻击,那么
公钥将是伪造的、数字签名将失效 - 所以在验证签名之前,首先得先验证公钥的合法性
- 如何验证公钥的合法性?
答:证书
- 3.6、证书(Certificate)
- 证书,联想的是驾驶证、毕业证、英语四六级证等等,都是由权威机构认证的
- 密码学中的证书,全称叫公钥证书(Public-key Certificate,PKC),跟驾驶证类似
- 里面有姓名、邮箱等个人信息,以及此人的公钥
- 并由认证机构(Certificate Authority,CA)施加数字签名
- CA就是能够认定“公钥确实属于此人”并能够生成数字签名的个人或者组织
- 有国际性组织、政府设立的组织
- 有通过提供认证服务来盈利的企业
- 个人也可以成立认证机构
- 3.7、证书的利用:保证了公钥的正确性,防止中间人攻击,这样数字签名才有意义
3.8、证书的注册和下载