本节将介绍如何从用户角度增强隐私保护和安全的方法,包括散列函数、密钥生成函数、对称/非对称加密等。该部分的内容仅作了解即可。

目录如下:

在介绍计算机系统安全或密码学的概念之前,课程首先给出了的概念。在信息论中,熵度量了不确定性并可以用来决定密码的强度。熵的单位是比特。因此,使用多少比特的熵取决于应用的威胁模型。例如,大约 40 比特的熵足以应对在线穷举攻击。

加密散列函数是散列函数中的一种单向函数,即很难通过函数的输出结果来反推出函数的输入。例如 SHA-1 是在 Git 中使用的一种散列函数,可以将任意大小的输入映射为一个 160 比特的输出,而其散列值通常的呈现形式为 40 个十六进制数。你可以在 Git 下使用sha1sum命令查看某个字符串的 SHA-1 值,如下所示:

1
2
3
4
5
6
7
8
9
➜  demo git:(master) ✗ print "hello" | sha1sum 
f572d396fae9206628714fb2ce00f72e94f2258f  -
➜  demo git:(master) ✗ print "hello" | sha1sum
f572d396fae9206628714fb2ce00f72e94f2258f  -
➜  demo git:(master) ✗ print "hello " | sha1sum
2beec0d1b3eeee6c25b1eacc1063338047d588e3  -
➜  demo git:(master) ✗ print "Hello " | sha1sum
a83f9352aa642ceec0a03b126e453a5984cf68ab  -
➜  demo git:(master)

对于这些结果,都是通过随机语言机得到的。它对于任何输入都回传一个真正随机的输出。而对于相同的输入,该语言机每次都会使用同一方法输出。也就是说,随机预言机就是一个将所有可能的输入与输出作随机映射的函数。

那么密码散列函数(加密散列函数)可以应用于哪些方面呢?

  • Git 中的内容寻址存储。
  • 文件信息的摘要。
  • 承诺机制

密钥派生函数用于生成固定长度的密钥,在其它密码算法中较为常用。例如,在网站上登录用户名时,由于存储登录凭证时不能直接存储明文密码。因此,可以针对每个用户随机生成一个盐,即 salt=random(),并将其进行存储。通过密钥生成函数对使用了盐的明文密码生成哈希值,即KDF(password+salt)。那么在执行登录验证请求时,用户输入的密码与盐值重新计算哈希值,即KDF(input_password+salt),然后在与之前存储的哈希值做对比,就可以对登录的用户进行密码的验证了。

对于对称加密非对称加密的概念与应用,其实在 HTTPS 的加密过程中就涉及到了这两种技术。至于如何对两者进行区分,可以将对称加密和非对称加密比作门锁。对称加密就好比一个防盗门,只要有钥匙的人都可以打开门或锁门。而非对称加密就好比一个可以拿下来的挂锁。你可以将打开状态的挂锁(公钥)给任何一个人,但唯一的钥匙(私钥)需要你自己保留着。这样的话,当他们将某些信息装进盒子里并锁上之后,只有你可以使用保留的钥匙进行开锁。


至此,该系列的学习就结束了。至于最后的两节:大杂烩提问&回答,这里不再给出,都是一些比较零碎但相对实用的知识点,感兴趣的可以看看。

总体来说,对我帮助最大的课程有 Shell Tools and ScriptingData WranglingCommand-line Environment 以及 Version Control (Git),相当于对以往知识的查漏补缺,复习并拓展了相关内容。