更多密码学概念
...
数字证书、X.509 标准与 PKI
...
https://cryptography.io/en/latest/x509/
传输层安全协议(TLS)与 SSL
...
https://en.wikipedia.org/wiki/Transport_Layer_Security
密码套件是一组用于保护采用传输层安全协议(TLS)或其现已弃用的前身安全套接层(SSL)的网络连接的算法。密码套件通常包含:一种密钥交换算法、一种对称加密算法,以及一种消息认证码(MAC)算法。
外部身份验证与 OAuth
...
双因素身份验证与一次性密码
多因素身份验证会增加额外的身份验证层。通常,这些因素应归入以下类别:
- 我知道的信息
- 我拥有的物品
- 我自身的特征
双因素身份验证要求实现上述三个类别中的两个。最常见的双因素身份验证组合是用户密码和一台接收或生成一次性密码的设备。生成一次性密码(OTP)时会使用基于 HMAC 的一次性密码算法。
基于 HMAC 的一次性密码(HOTP)
HOTP 算法基于 HMAC,使共享同一秘密值的双方能够生成相同且便于人工输入的一次性密码;每个密码仅用于一次身份验证尝试。HOTP 的关键参数是双方必须事先交换的秘密值:
HOTP(hash_function, secret, value_length) -> hotp
hotp.generate() -> auth_code
hotp.validate(auth_code) -> true/false
hash_func 可以是任意密码学哈希函数。secret 是双方必须共享并保密的任意字节串。value_length 定义 auth_code 的长度。
基于计数器的一次性密码算法(HOTP)
在 HOTP 场景中,HOTP 函数包含一个内部计数器。双方必须保持各自的计数器同步,才能成功地相互认证。每当请求 HOTP 生成一个 auth_code 时,计数器都会递增。
基于时间的一次性密码算法(TOTP)
基于时间的一次性密码算法(TOTP)是 HOTP 的时间型变体,其中的计数器根据以 Unix 时间表示的当前时间计算。时间间隔是生成 TOTP 时使用的另一个参数,用来定义给定认证码的有效时长。
hotp_counter = (current_time - initial_time) / time_interval
要使 TOTP 正常工作,双方的时钟需要保持同步,并使用尽可能小的验证时间步长窗口;该窗口用于容纳用户输入延迟、网络延迟和时钟偏差。
otp = TOTP(hash_function(secret), hotp_counter)
基于时间的一次性密码实践
Google Authenticator 是双因素身份验证的一个常见用例。服务器生成一个秘密值,并通过二维码与客户端共享。客户端扫描二维码,将秘密值存储在手机的 Google Authenticator 应用中。此后,服务器和手机就会开始生成相同的一次性密码。
下面是一个使用和测试 TOTP 的 Web 版 JavaScript 示例:

受感染的密码系统与密码学后门
https://en.wikipedia.org/wiki/Kleptography
其他密码学概念与标准
需要说明的是,实用密码学的内容无穷无尽。下面列出了一些本书不会展开讲解的密码学概念、算法、协议和标准,你可以通过所附链接进一步阅读:
- Kerberos——...
- IPsec——...
- WiFi 密码学标准——...
- PGP——...
- S/MIME——...
- JSON Web Token(JWT)
- 对象标识符(OID)——https://en.wikipedia.org/wiki/Object_identifier,例如算法 "SHA-256" 的 OID 为 "2.16.840.1.101.3.4.2.1"。
- 密码学最佳实践:https://gist.github.com/atoponce/07d8d4c833873be2f68c34f9afc5a78a