0x00 密码学家的认证工具
我们之前两篇讲的对称密码和公钥密码是为了保证消息的保密性
实际上密码学家的工具箱还有加密满足不了的问题
其他一些工具东西我们叫做认证工具,认证工具的原理相对对称密码和公钥密码容易明白
0x01 单项散列函数
单项散列函数,就是采集文件”指纹”的技术,生成的散列值,就相当于消息的”指纹”,输入为消息(message),输出为散列值(hash value)
是用来防止消息被篡改,保持消息完整性
其实单项散列函数是程序员最常用到的,md5之类大家都知道,生成原理其实不用太了解,和大学数据结构学的链表之类的哈希算法也差异比较大,知道概念和强弱碰撞性及hash长度拓展攻击,生日攻击等就可以
特性
- 单项散列函数可以根据任意长度的消息计算出固定长度的散列值
- 能够快速计算出散列值
- 消息不同散列值也不同
抗碰撞性
两个不同的消息产生同一个散列值的情况成为碰撞,如果要将单项散列函数用于完整性检查,就需要确保实用中不可能被人为地发现碰撞
难以发现碰撞的性质称为抗碰撞性,单项散列函数要具备强弱抗碰撞性
- 弱抗碰撞性:给定一条消息,确保找到和该条消息具有相同散列值的另外一条消息是非常困难的
- 强抗碰撞性:找到散列值相同的两条不同的消息是非常困难的
用法
- 检测软件是否被篡改
- 基于口令的加密PBE(Password Based Encryption):将口令和盐混合后计算散列值
- 消息验证码
- 数字签名
- 伪随机数生成器
- 一次性口令
算法有MD5、SHA1、SHA2、SHA—3等
hash长度拓展攻击
简单讲,就是MD5和SHA-1等通过类似块加密的方式生成,可以在明文后面添加段内容,使得消息验证码中用原来的签名继续hash添加的值也可以得到也可以得到正确的hash值
生日攻击
即高中排列组合里计算一个班两个生日相同的人的概率
同理,计算2^512
的散列值,找到两条相同的概率,尝试次数大概是2^256
0x02 消息验证码
消息认证码(MAC)是一种确认完整性并进行认证的技术
它的输入包括任意长度的消息和一个发送者与接收者之间共享的密钥,它可以输出固定长度的数据,这个数据称为消息验证码
HMAC
一图流解释HMAC
HMAC伪代码
因为有共享的密钥,所以可以对消息进行认证
HMAC的攻击方式
- 重放攻击(对发送的消息增加序号、时间戳和nonce解)
- 密钥推测攻击
0x03 数字签名
数字签名主要是为了防止否认,但是又有确认消息完整行并进行认证的功能
- 消息的发送者和接收者不共享一个密钥
- 生成消息签名由消息发送者完成,签名密钥只有发送者持有
- 验证消息签名由消息接收者完成,验证密钥则是任何需要验证签名的人都可以持有
公钥密码与数字签名
一图流解释基于公钥密码的数字签名
以RSA为例子
签名过程
- 私钥E和N
签名=消息^E mod N
验证过程
- 公钥D和N
消息=签名^D mod N
结合公钥密码的功能思考一下,就知道为什么数字签名可以防止否认了,确定公钥和私钥是一对,就可以防止消息发送者否认
0x04 证书——公钥的数字签名
无法判断自己手上的公钥是否合法,就有可能遭到中间人攻击
证书,就是用来对公钥合法性提供证明的技术
证书作用
我们先打开浏览器看一张证书
证书的要素,不是全部,说一些比较重要的
- 签发者名称:也就是认证机构,理解为可以信任的第三方,它说是真的就是真的
- 主题名称:公钥所有者
- 公钥信息:验证签名、加密使用的公钥
一图流解释证书作用
公钥基础设施(PKI)
制定证书的规范不足以支持公钥的实际运用,我们还需要确定证书谁颁发,如何颁发,私钥泄漏如何作废证书等等
我们为了能够更有效地运用公钥而制定的一系列规范和规格的总称就是公钥基础设施PKI
PKI有三个要素
- 用户:使用PKI的人
- 认证机构:颁发证书的人
- 仓库:保存证书的人
上图就是PKI的主要工作,其他细节需要进一步了解