读软件开发安全之道:概念、设计与实施08密码学(下)

1. 对称加密

1.1. symmetric encryption

1.2. 使用各方共享的密钥来隐藏数据

  • 1.2.1. 对称加密在本质上依赖共享密钥

1.3. 所有加密都是通过对明文进行转换,把明文消息(或者原始消息)变成无法识别的形式(也称为密文)​,从而隐藏原始消息内容的

1.4. 可逆的转换称为对称加密,因为只要知道密钥,我们就既可以进行加密,也可以进行解密

  • 1.4.1. 对称加密算法会使用密钥自定义消息的转换方法,从而建立安全的私人通信,双方首先需要对在通信过程中使用的密钥达成一致

  • 1.4.2. 解密算法也使用相同的密钥把密文转换成明文

1.5. 一次性填充

  • 1.5.1. one-time pad

  • 1.5.2. 它需要通信各方都提前同意使用一个秘密的、由随机位组成的字符串作为加密密钥

  • 1.5.3. 假如密钥是随机的,就代表各个消息位要么随机取反,要么保持不变,所以攻击者不可能在不知道密钥的情况下把密文还原回原始的消息

  • 1.5.4. 对消息中一半的位取反是最理想的消息隐藏方式,因为无论是保留还是反转消息中的大多数位都会在一定程度上揭示出消息的明文

  • 1.5.5. 一次性密钥的使用限制是大多数应用都不会使用这种加密方法的原因

  • 1.5.5.1. 密钥的长度限制了消息的长度

  • 1.5.5.2. Alice和Bob很可能事先完全不知道他们要加密的数据有多长,所以想要弄清楚他们需要多长的密钥也就很不现实

1.6. 高级加密标准

  • 1.6.1. Advanced Encryption Standard,AES

  • 1.6.2. 一种使用相当频繁的现代对称加密块加密算法

  • 1.6.2.1. 在块加密中,长消息会被分为多个块大小的数据段,短消息则会用随机位填充到块的大小

  • 1.6.3. 用相同的方式加密相同的消息也称为电子密码本(Electronic Code Book,ECB)模式

  • 1.6.3.1. 因为可能受到重放攻击的威胁,所以这种做法并不理想

  • 1.6.4. 把反馈信息或者其他差异性的内容引入后续的数据块,让生成的密文和前面数据块的内容或序列中的位置产生关联。这可以确保哪怕明文块完全相同,加密的密文还是截然不同

1.7. 使用对称加密

  • 1.7.1. 对称加密是现代加密算法的主力军,因为只要使用得当,这种加密算法既快捷又安全

  • 1.7.2. 加密可以对通过不安全信道进行传输的数据,以及存储设备中保存的数据提供保护

  • 1.7.3. 基本的限制

  • 1.7.3.1. 密钥的建立

>  1.7.3.1.1. 加密算法依靠的是提前准备好的密钥,但是并没有明确指出如何建立这些密钥
  • 1.7.3.2. 密钥的建立
>  1.7.3.2.1. 加密算法依靠的是提前准备好的密钥,但是并没有明确指出如何建立这些密钥
  • 1.7.3.3. 密钥的保密性
>  1.7.3.3.1. 加密的有效性完全取决于我们能否维持密钥的保密性,同时还能在需要的时候使用密钥
  • 1.7.3.4. 密钥的长短
>  1.7.3.4.1. 越长的密钥也就越安全(理论上最理想的密钥就是一次性填充密钥)​,但是维护长密钥的成本更高,而且使用长密钥的运算效率更低

1.8. 对于对称加密来说,签名是不可能实现的,因为通信的双方都知道密钥

2. 非对称加密

2.1. asymmetric encryption

2.2. 使用接收方拥有的密钥来隐藏数据

2.3. 非对称加密完全违背了我们对加密这件事的直觉,但非对称加密的强大恰恰源于此

2.4. 如果使用非对称加密,那么虽然Bob可以把加密的消息发送给Alice,但是他自己却无法解密这条消息

  • 2.4.1. 对Bob来说,加密就成了一个单向函数,只有Alice拥有执行逆运算(也就是解密消息)的密钥

2.5. 非对称加密会使用一对密钥,即用来加密的公钥(public key)和用来解密的私钥(private key)

  • 2.5.1. 非对称加密的这种做法是革命性的,它通过密钥的方式赋予了Alice独一无二的能力

2.6. RSA密码系统

  • 2.6.1. 数学背景最简单的初始非对称加密协议

  • 2.6.2. RSA的核心理念就是两个素数的相乘很容易计算,但是找到两个素数乘积的因数可就是难上加难了

  • 2.6.3. 明文攻击(chosen plaintext attack)可通过使用随机位填充消息来轻松挫败,让攻击者完全无从猜测加密的消息

  • 2.6.4. 以前,RSA算法对于大多数计算机来说都会占用相当多的计算资源,所以这种算法需要昂贵的定制硬件

  • 2.6.5. 如今,RSA正在被诸如椭圆曲线算法(elliptic curve algorithm)等逐渐取代

  • 2.6.5.1. 这类算法通过不同的数学模型来实现类似的功能,这类算法更加“物有所值”​,它们可以用更少的计算产生更加强大的加密能力

2.7. 因为非对称加密比对称加密需要消耗更多的计算资源,所以我们通常会选择用非对称加密的方法来处理随机密钥,然后用密钥来对消息本身执行对称加密

2.8. 非对称加密的安全性取决于是不是只有通信方知道自己的私钥,所以只有这个通信方可以用私钥来进行签名

  • 2.8.1. 因为验证工作只需要使用公钥就可以完成,所以这个过程不会泄露任何秘密

3. 数字签名

3.1. digital signature

3.2. 会根据只有签署方拥有的密钥来对数据进行认证

3.3. 公钥加密也可以用来创建数字签名,让接收方验证消息的真实性

  • 3.3.1. 签名本身和消息加密无关,但Alice的签名可以让Bob确信,这个消息确实是她发送的

  • 3.3.2. 数字签名也可以充当通信的证据,让Alice无法否认她曾经发送过这个消息

3.4. 真实性和不可抵赖性是通信中的两大重要安全属性,另一个则是机密性

3.5. 签名和加密是两个独立的过程,根据应用的不同,我们可以只进行签名、只进行加密或者两项操作都执行

3.6. 数字签名广泛应用于签署数字证书​、邮件、应用代码和合法文件,也广泛应用于保护各类加密货币(如比特币)​

3.7. 人们会对消息的摘要值进行签名,其目的是让一次签名操作就可以覆盖整个文档

4. 数字证书

4.1. digital certificate

4.2. 会根据对根证书的信任来对签署方进行认证

4.3. 公钥加密的优势在于它提供的便利性

  • 4.3.1. 它可以让我们用一把钥匙处理所有通信,而不需要为各个通信分别管理不同的密钥,只要我们把密钥宣告给全世界的任何人自由使用

4.4. 证书认证机构

  • 4.4.1. Certification Authority,CA

  • 4.4.2. 新的CA需要广泛地发布自己的公钥

  • 4.4.3. 操作系统和浏览器需要及时地预装一系列可靠的CA根证书(root certificate),这些证书都用CA对应的公钥进行了自签名

5. 密钥交换

5.1. key exchange

5.2. 让双方通过公开的信道来建立共享密钥,不管是否有人在窃听这个信道

5.3. 在RSA问世之后不久,怀特菲尔德·迪芙(Whitfield Diffie)和马丁·赫尔曼(Martin Hellman)开发了一个非常实用的密钥交换算法

5.4. 在互联网上建立安全通信信道(比如通过TLS协议)方面,密钥交换是一种特别方便的机制

5.5. 一旦拥有了共享密钥,双方就可以通过加密通信来建立安全的私有信道

6. 使用加密

6.1. 从密码学的角度来看,安全随机数增加了不可预测性,从而缓解了通过猜测进行的攻击

6.2. 摘要提供了一种安全的方式,可以提取唯一的数据来对原始数据执行完全性检查

  • 6.2.1. 安全摘要提供了一种理想的方式来验证数据是否遭到了改动,而不需要我们为数据保存一份完整的副本

6.3. 加密包括对称加密和非对称加密两种方式,其目的都是保护数据的机密性

  • 6.3.1. 在这些敏感数据进入前端Web服务器的一刹那就对所有入站敏感数据执行加密

  • 6.3.2. 在独立的站点同步保存加密的数据和密钥

  • 6.3.2.1. 一家企业希望把长期数据存储外包给第三方备份

  • 6.3.2.2. 他们可以把加密数据交接出去进行妥善保存,同时把密钥保存在自己的保险库中待用,以备他们需要从备份中恢复数据

  • 6.3.3. 加密也不是灵丹妙药

  • 6.3.3.1. 如果攻击者可以观测到加密数据或者其他元数据的频率或者规模,我们可能也会给攻击者泄露一些信息

  • 6.3.4. 加密的安全性依赖于数学上的未知领域,以及当前最先进的数字硬件技术,这两个领域仍在不断发展和进步

  • 6.3.4.1. 如果某位数学家未来发现了一种高效的方法可以破解当前的算法,这位数学家必然声名鹊起

  • 6.3.4.2. 不同类型计算技术(譬如量子计算)的前景也是另一个潜在的威胁

  • 6.3.5. 加密也和其他所有缓解方法一样,一定会包含一些取舍权衡和未知风险,但加密仍然是绝对值得一用的伟大工具

6.4. 数字签名是一种对消息进行认证的方式

6.5. 数字证书可以利用对CA的信任,来简化共享真实公钥的方式

6.6. 密钥交换完善了加密工具箱,让通信双方可以通过公共网络连接安全地远程协商密钥

6.7. 正确使用加密算法非常重要,因为你可以避免给对手提供发起这类攻击的机会