)(Entropy) 度量了不确定性并可以用来决定密码的强度。
散列函数可以被认为是一个不可逆,且看上去随机(但具确定性)的函数。
密码散列函数可应用于:git中的内容寻址存储、或者文件信息摘要。文档还介绍了一个应用:承诺机制(Commitment scheme)

一个优秀的散列函数拥有以下特征:

  1. 不可逆性:不能通过加密后反推回加密前的内容
  2. 抗冲突性:对于不同的内容,不会得到一个相同的输出
  3. 确定性:对于不变的输入永远有相同的输出。

密钥生成函数

  • 从密码生成可以在其他加密算法中使用的密钥,比如对称加密算法。
  • 存储登录凭证时不可直接存储明文密码。
    正确的方法是针对每个用户随机生成一个) salt = random(), 并存储盐,以及密钥生成函数对连接了盐的明文密码生成的哈希值KDF(password + salt)
    在验证登录请求时,使用输入的密码连接存储的盐重新计算哈希值KDF(input + salt),并与存储的哈希值对比,如果结果不对,则登陆失败。


对称加密

这种加密方法是将原来的某种信息按照某个规律打乱。打乱的方式称为加密算法,而打乱过程中的参数就叫做密钥(cipher code)。
发出信息的人根据密钥来给信息加密,而接收信息的人利用相同的密钥,来给信息解密。就好像一个带锁的盒子。发送信息的人将信息放到盒子里,用钥匙锁上。而接受信息的人则用相同的钥匙打开。加密和解密用的是同一个密钥
不知道密钥的情况下很难解出明文

  1. keygen() -> key (这是一个随机方法)
  2. encrypt(plaintext: array<byte>, key) -> array<byte> (输出密文)
  3. decrypt(ciphertext: array<byte>, key) -> array<byte> (输出明文)

补充,对称加密的不安全性:

如果一对一的话,那么两人需要交换一个密钥。理论上,如果密钥绝对安全,而且加密算法绝对复杂的话,对称加密是很难破解的。但通信双方很难绝对保证密钥的安全。一旦有其他人窃取到密钥,那么所有通信都变得不安全了。特别在一对多的话,如果共用同一套密钥,那么某一方通信的破解就意味着所有通信的破解。

非对称加密

对称加密的薄弱之处在于给了太多人的钥匙(人多不安全)。此时,非对称加密的好处就出现了。

非对称加密算法需要两个密钥

  1. 一个是私钥(private key),不向外公布;
  2. 另一个是公钥(public key),公布公钥不会像公布对称加密的共享密钥那样影响加密体系的安全性。

公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。即使公钥被黑客截胡,没有密钥也是无法破解的。(顺带一提,网络协议中的SSL就同时用到了对称加密和非对称加密,这也是HTTPS为什么安全的原因)

非对称加密算法实现机密信息交换的基本过程是:

  • A生成一对密钥并将公钥公开,
  • 其他角色使用该密钥(A的公钥)对机密信息进行加密后再发送给A;
  • A再用自己私钥对加密后的信息进行解密。


非对称加密使用以下几个方法来实现加密/解密(encrypt/decrypt)

keygen() -> (public key, private key)  (这是一个随机方法)
encrypt(plaintext: array<byte>, public key) -> array<byte>  (输出密文)
decrypt(ciphertext: array<byte>, private key) -> array<byte>  (输出明文)
sign(message: array<byte>, private key) -> array<byte>  (生成签名)
verify(message: array<byte>, signature: array<byte>, public key) -> bool  (验证签名是否是由和这个公钥相关的私钥生成的)

书里有个通俗易懂的比喻来形容:

对称加密和非对称加密可以类比为机械锁。 对称加密就好比一个防盗门:只要是有钥匙的人都可以开门或者锁门。 非对称加密好比一个可以拿下来的挂锁。你可以把打开状态的挂锁(公钥)给任何一个人并保留唯一的钥匙(私钥)。这样他们将给你的信息装进盒子里并用这个挂锁锁上以后,只有你可以用保留的钥匙开锁。