好奇的探索者,理性的思考者,踏实的行动者。
Table of Contents:
口令:password, passcode, pin(Personal Identification Number)
编码:encode
密码:cryptography
主要技术
对称密码是指在加密和解密时使用同一密钥的方式。
公钥密码是指在加密和解密时使用不同密钥的方式,又称为非对称加密。
将对称密码和公钥密码结合起来的密码方式称为混合密码系统。
单项散列函数,用于保证完整性,数据没有被篡改过。
消息认证码,确认消息是否来自所期望的对象,但不能防止发送者的否认。
数字签名能够保证数据不会被篡改,也防止发送者的否认。
伪随机数生成器是一种能够模拟产生随机数列的算法,同时承担着密钥生成的重要职责。
密码与信息安全常识:
不要使用自创的密码算法
使用低强度的密码比不进行任何加密更危险
任何密码总有一天都会被破解
密码只是信息安全的一部分
凯撒密码,通过平移字母顺序达到加密效果,平移字母个数为密钥。
简单替换密码,通过维护字母对照表达到加密效果。
密钥空间,所有可用密钥的总数就是密钥空间的大小,空间越大,暴力破解越困难。
频率分析破译:通过分析语言中高频使用字母及单词达到破译效果。
将现实世界中的东西映射为比特序列的操作称为编码。
XOR,异或,相同为0 ,不同为1。
比特序列的异或,将明文 A 用密钥 B 进行加密,得到密文 A XOR B,将密文 A XOR B 用密钥 B 进行解密,得到明文 A。
DES(Data Encryption Standard),可被短时间破译,不推荐使用。
三重 DES,为了增加 DES 的强度,将DES 重复3次所得到的一种密码算法。
加密过程为:加密,解密,加密,这么做的目的是为了能够让三重DES 兼容普通的 DES。
AES(Advanced Encryption Standard)取代DES。通过评选,最终选择 Rijndael。
分组密码是每次只能处理特定长度的一块数据的一类密码算法,一个分组的比特书就称为分组长度。
例如 DES 和三重 DES 的分组长度都是 64 比特,也就是说一次只能加密64 比特的明文,并生成64 比特的密文。
公钥密码解决的问题:密钥发送
私钥加密公钥解密,或公钥加密私钥解密,
公钥密码劣势:
1. 公钥密钥处理速度远远低于对称密码
2. 公钥密码难以抵御中间人攻击
混合密码机制:
用非对称秘钥传送对称密码(回话秘钥),之后用回话秘钥传送密文
单向散列函数(one-way hash function),有一个输入和输出,其中输入称为消息(message),输出称为散列值(hash value)。单向散列函数可以根据消息的内容计算出散列值,而散列值就可以用来检查消息的完整性。
特性:
根据任意长度的消息计算出固定长度的散列值
能够快速计算出散列值
消息不同散列值也不同
两个不同的消息产生一个散列值的情况称为碰撞(collision),难以发现碰撞的性质称为抗碰撞性
要找到和该条消息具有相同散列值的另一条消息是非常困难的,这一性质称为弱抗碰撞性
要找到散列值相同的两条不同的消息是非常困难的,这一性质称为强碰撞性
密码学中使用的单向散列函数,不仅要具备弱抗碰撞性,还要具备强抗碰撞性
具备单向性
实际应用:
检测软件是否被篡改
基于口令的加密
消息认证码
数字签名
伪随机数生成器
一次性口令
具体例子:
MD4,MD5(不安全)
SHA-1(碰撞攻击算法由山东大学王小云提出)
SHA-2(一共六个版本 SHA-256,SHA-512等,主要区别是生成的位数不同,目前也安全)
RIPEMD-160(RIPEMD的强碰撞性已经被攻破,RIPEMD-160还没有,比特币用的就是RIPEMD-160)
* SHA-3(安全)
Keccak是一种被选定为SHA-3标准的单向散列函数
对单向散列函数的攻击:
暴力破解:对单向散列函数进行暴力破解时,每次改变一下消息值然后对这些消息求散列值,这相当于尝试破解单向散列函数的“弱抗碰撞性”的攻击。
生日攻击:生日攻击是找到散列值相同的两条消息,而散列值则可以是任意值,这相当于尝试破解单向散列函数的“强抗碰撞性”的攻击。
单向散列函数能够辨别出篡改,但是无法辨别出伪装。
消息的完整性(integrity):消息没有被篡改,也叫一致性
消息的认证(authentication):消息来自正确的发送者
消息认证码(message authentication code)是一种确认完整性并进行认证的技术,简称为MAC
消息认证码的输入是任意长度的消息和一个发送者与接收者之间的共享的密码,它可以输出固定长度的数据,这个数据称为MAC值
消息认证码是一种与密钥相关联的单向散列函数
使用单向散列函数实现:
使用SHA-1,MD5之类的单向散列函数可以实现消息认证码,其中一种实现方法称为HMAC
使用分组密码实现:
使用DES,AES之类的分组密码可以实现消息认证码。
将分组密码的密钥作为消息认证码的共享密钥来使用,并用CBC模式将消息全部加密。由于消息认证码中不需要解密,因此将除最后一个分组以外的密文部分全部丢弃,而将最后一个分组用作MAC值。
HMAC
HMAC是一种使用单向散列函数来构造消息认证码的方法(RFC2104),其中HMAC中的H就是Hash的意思
HMCA中所使用的单向散列函数并不仅限于一种,任何高强度的单向散列函数都可以被用于HMAC
使用SHA-1,MD5,RIPEMD-160所构造的HMAC,分别称为HMAC-SHA-1,HMAC-MD5和HMAC-RIPEMD
无法解决的问题:
对第三方证明
防止否认
私钥签名,公钥验证
消息认证码无法防止否认,发送者与接收者共享同一个密钥,对第三方来说,无法确认消息是谁发送的
数字签名是一种将相当于现实世界中的盖章,签字的功能在计算机世界中进行实现的技术。使用数字签名可以识别篡改和伪装,还可以防止否认。
对消息的散列值进行签名(A向B发送)
1. A生成密钥对
2. A对消息生成散列值
3. A用私钥对散列值签名(加密)
4. A向B发送消息和签名
5. B生成A消息的散列值
6. B用公钥解密签名并和散列值对比是否一样
用RSA生成签名: 在RSA中,被签名的消息,密钥以及最终生成的签名都是以数字形式表示的,在对文本进行签名时,需先将文本编码成数字
签名=消息^D mod N (RSA生成签名)
这里的D和N就是签名者的私钥。签名就是对消息的D次方求modN的结果
用RSA验证签名:
由签名求得的消息=签名^E mod N (RSA验证签名)
这里的E和N就是签名者的公钥。接受者计算签名的E次方并求modN,得到“由签名得到的消息”,将其与发送者直接发送的消息内容进行对比,如果内容一样则签名通过
缺点:
无法判断公钥是否属于签发者
公钥证书(PKC)里面记有姓名、组织、邮箱地址等个人信息,以及属于此人的公钥,并由认证机构(certifying authority,CA)施加数字签名。
只要看到公钥证书,我们就可以知道认证机构认定该公钥的确属于此人
典型使用流程:
1. 接收者生成密钥对
2. 接收者在认证结构 Trent 注册自己的公钥
3. 认证结构 Trent 用自己的私钥对 Bob 的公钥施加数字签名并生成证书
4. 发送者得到带有认证机构 Trent 的数字签名的接收者的公钥(证书)
5. 发送者使用认证机构 Trent 的公钥验证数字签名,确认接收者公钥的合法性
6. 发送者使用接收者的公钥加密消息并发送到接收者
7. 接收者使用自己的私钥解密密文得到发送者的消息
公钥基础设施是为了能够更有效的运用公钥而指定的一系列规范和规格的总称,简称 PKI。
组成要素:
用户—使用 PKI 的人
认证机构(CA)—颁发证书的人
仓库—保存证书的数据库
认证机构的工作:
生成密钥对
注册证书
作废证书与CRL
密钥就是一个巨大的数字,数字本身不重要,重要的是密钥空间的大小,空间越大,暴力破解就越困难,空间的大小是由密钥长度决定的。
密钥与明文是等价的,明文的价值就是密钥的价值。
密钥分类:
会话密钥:密钥是仅限于本次通话的一次性密钥,下次通信就不能使用
主密钥:一直被重复使用的密钥
内容加密密钥(CEK):加密的对象是用户直接使用的消息
密钥加密密钥(KEK):加密的对象是密钥
密钥的用途:
在对称密码中,由于发送者和接收者之间需要共享密钥,因此对称密钥又称为共享密钥密码。
在公钥密码中,加密和解密使用的是不同的密钥,加密的是公钥,解密的是私钥,私钥也称为私密密钥,公钥与私钥也称为密钥对。
* 对称密码和公钥密钥的密钥都是用于确保机密性的密钥,相对的,消息认证码和数字签名所使用的密钥,则是用于认证的密钥。
为了不让攻击者看穿而使用随机数。
应用场景:
生成密钥
用于对称密码和消息认证码
生成密钥对
用于公钥密码和数字签名
生成初始化向量
用于分组密码的 CBC、CFB、OFB 模式
生成 nonce
用于防御重放攻击以及分组密码的 CTR 模式等
生成盐
用于基于口令的密码等
随机数的性质:
随机性—不存在统计学偏差,完全杂乱的数列
不可预测行—不能从过去的数列推测出下一个出现的数
不可重现性—除非将数列本身保存下来,否则不能重现相同的数列
SSL(Secure Socket Layer)
TLS(Transport Layer Security)
当 Web 浏览器发送请求时,请求的数据会作为客户端请求发送给服务器,如果通信内容被窃听者所窃取,那么窃听者就会得到请求数据。可以使用 SSL/TLS 作为对通信进行加密的协议,然后再次智商承载 HTTP。通过将两种协议进行叠加,我们就可以对HTTP 的通信进行加密,防止窃听。通过 SSL/TLS 进行通信时,URL 以 https 开头。
解决问题:
机密性问题
解决方式:对称密码、伪随机数生成器、公钥密码
完整性问题
解决方式:消息认证码
认证问题
解决方式:数字签名
SSL 与 TLS 区别:
SSL 是 1994年由网景公司设计的一种协议,于1995年发布了3.0 版本。
TLS 设市 IETF 基于 SSL 3.0 版本的基础上设计的协议,在 1999年发布了 TLS 1.0 版本,实际上相当于 SSL 3.1。2006 年发布 TLS 1.1 版本,在对称密码算法中加入了 AES 支持。
SSL/TLS 使用到的密码技术:
公钥密码
加密预备主密码
单向散列函数
构成伪随机数生成器
数字签名
验证服务器和客户端的证书
伪随机数生成器
生成预备主密码
根据主密码生成密钥
生成初始化向量
对称密码
确保片段的机密性
消息认证码
确保片段的完整性并进行认证
密码的作用是为了确保机密性,将明文转换为密文。转换之后,密文不需要保护了,需要保护的是加密时使用的密钥。通过保护较短的密钥来保护较长的明文,称为机密性的压缩。
单向散列函数时用于确认完整性的,不必检查较长的明文的完整性,只要检查散列值就能确认,这种做法称为完整性的压缩。
消息认证码和数字签名都是用于认证的技术,通过较短的认证富豪来对较长的消息进行认证,称为认证的压缩。
只有完美的密码,没有完美的人。