-
单向散列函数
1.1 什么是单项散列函数?
1.2 单项散列函数的性质
1.3 单项散列函数实际应用 -
消息认证码——消息被正确传送了吗?
2.1 消息认证码(Message Authentication Code) 是一种与密钥相关联的单项散列函数
2.2 消息认证码实现方式
2.3 消息认证MAC解决的问题 -
数字签名——消息到底是谁写的
3.1 签名概述
3.2 使用了签名的实例
3.3 签名解决的问题 -
证书——公钥合法了
证书主要包含的内容
1 单向散列函数
1.1 什么是单项散列函数?
网络下载软件,或者传输文件,如何验证没有被第三方篡改呢?
即是数据的的完整性(intergrity),也称一致性。
单项散列函数就是生成文件“指纹”的方法。
单项散列函数
- 散列值是固定长度
单项散列函数也称为消息摘要函数(message digest function
),哈希函数,杂凑函数。
1.2 单项散列函数的性质
- 根据任意长度的消息计算出固定长度的散列值。
- 能快速计算出散列值。
- 消息不同,散列值也不同。
- 具备单项性。
弱靠碰撞性
单向散列函数都必须确保要找到和该条消息具有相同散列值的另外一条消息是非常困难的。
强抗碰撞性
找到散列值相同的任意两条不同消息是非常困难的。这里散列值可以是任意的。
1.3 单项散列函数实际应用
1.3.1 检测软件是否被篡改
1.3.2 基于口令的加密
寄予口令的加密是将口令和盐(salt,通过伪随机数生成器产生的随机值)混合后计算其散列值,然后将这个散列值作为加密的密钥。
1.3.3 消息认证码
消息认证码是将“发生者和接受者之间共享的密钥” 和 “消息” 进行混合后计算的散列值。使用消息认证码可以检测并防止通信过程中的错误,并进行认证。
2 消息认证码——消息被正确传送了吗?
2.1 消息认证码(Message Authentication Code) 是一种与密钥相关联的单项散列函数。
-
要计算MAC值必须持有共享密钥,MAC正是利用这一性质确认完整性的。
-
只有通信双方才能持有共享密钥,密钥配送问题可以使用公钥密码,Diffie-Hellman密钥交换,密钥分配中心等来解决。
2.2 消息认证码实现方式
使用分组密码实现
舍弃最后一个分组之前的所有密文,最后一组作为MAC即可。
使用SHA-2 单向散列函数实现的 HMAC
2.3 消息认证MAC解决的问题
消息认证码解决了完整性与伪装问题,仍然无法解决“对第三方证明”和“防否认”问题。这就需要数字签名来解决。
3 数字签名——消息到底是谁写的
3.1 签名概述
设想要防否认,只要签名只能由消息发送者生产就OK了。
数字签名对签名者的秘钥和验证者的秘钥进行了区分,使用验证签名无法生产签名。签名秘钥只由签名者持有。
这和公钥密码有点相似了。事实上,签名就是公钥密码“反过来”实现的。
对于消息签名,速度太慢,因为每个消息的散列值是不一样的,所以一般只需要对消息的散列值进行签名就可以了。
3.2 签名实例
- 信息安全公告。
- 软件下载。
- 公钥证书。(得到合法的公钥)
- SSL/TLS。
3.3 签名解决的问题
通过对散列值签名我们可以解决完整性,篡改,伪造问题,但是用于验证签名的公钥是否是真正的发送者的呢?中间人可以用自己的私钥签名,并把自己的公钥发送给接受者。
为验证公钥是否合法,我们需要使用证书。
4 证书——公钥合法了
证书就是我们信任的第三方对发送者的公钥加上了他们的数字签名。相当于身份证一样的东西。这里的第三方包括例如赛门铁客等机构,也可以是自己组织内部成立的一个机构。
证书主要包含:
- 证书序号。
- 证书颁发机构。
- 公钥所有者。
- SHA-1 指纹。
- MD5指纹。
- 证书ID。
- 有效期起始时间。
- 有效期结束时间。
- 散列算法。
- 秘钥ID。
- 秘钥用途。