第21章 存储秘密
21.1 磁盘
- 存储秘密的一个很直接的办法是把秘密存储在计算机的硬盘上或其他永久存储介质上,这是可行的,但是任何使用此电脑的人都能使用该密钥。
- 一个更好的解决方案是让 Alice把密钥存储在她的PDA或智能手机上。这些设备很少会借给别人使用,而且无论去哪里都会随身携带,但这些小型设备很容易丢失或失窃。
21.2 人脑记忆
- 将密钥直接存储在人的大脑中,我们可以记住一个口令,并用这个口令加密其他密钥。
- 人类记忆口令的能力是相当差的,但是好的口令应该是不可预测的,它包含大量的熵。
- 我们可以使用密码短语来设置口令,但即便是使用密码短语,我们也是很难记住的。
加盐和扩展
- 盐就是一个随机数,与加密的口令存放在一起,最好采用256位的盐。
- 扩展一定是很长的计算。令\(p\)是密码口令,\(s\)是盐。使用任意保密性强的散列函数\(h\),计算:
- \[x_0 = 0 \]
- \[x_i = h(x_{i-1}||p||s) \; \; \; \; for \; i = 1, \cdots, r \]
- \[K = x_r \]
- 用\(K\)作为密钥来实际加密数据。参数\(r\)是计算迭代的次数,只要实际情况允许,\(r\)值应该尽可能大。
- 加盐和扩展的方法也体现了密钥协商中前向安全性的思想。生成会话的长期密钥可能被泄露,但是之前的通信都可以保证其安全性。
- 当攻击者同时攻击大量口令时,盐能够防止他利用规模扩大而节约计算量。
- 当我们把盐加入到扩展函数中时,所有的盐都是随机值,因此每个用户会使用不同的盐值。现在攻击者将不得不对每个文件计算一次扩展函数,而不是对每个口令计算一次。对于攻击者来说增加了很大的计算量。
21.3 便携式存储
- 存储秘密的另一个办法是在计算机之外存储。最简单的存储方式是把口令写在一页纸上,这种技术仅仅适用熵比较低的口令和密码短语。
- 一个更先进的存储方法是便携式存储。它可以是一张存储芯片卡、一张磁条卡、一个USB盘或是任何其他种类的数字存储设备。数字存储系统总是能存储至少256位的密钥,因此我们可以排除低熵的口令。便携式存储变得非常像一个密钥,无论谁得到它,都能够拥有访问权,因此需要安全地放置。
21.4 安全令牌
- 一个更好但也更贵的解决方案是使用我们称为安全令牌的设备。令牌的外部形状可以千变万化,从智能卡到iButton、USB加密狗或PC卡。它的主要性质是有一个永久性存储器(例如,没电时仍能保存数据的内存)和一个CPU。
- 安全令牌主要作为一个便携式存储设备来工作,但它在安全性上又有几点改进。安全令牌对输入口令的操作具有次上的限制,同时也能抵抗物理干扰。
- 安全令牌目前是最好也最实用的存储密钥的方法之一。它们相对便宜,并且足够小,方便携带。
- 用户行为是实际使用中需要注意的一个问题。
21.5 安全UI
- 如果令牌本身有一个安全的内置UI,我们就能得到更多的安全性。考虑一个有内置键盘和显示屏的安全令牌,那么口令或PIN就能够直接输入令牌而不需要信任外部的设备了。
- 为了阻止密钥的泄露,我们必须把涉及密钥的密码学过程嵌入令牌,这就要求在令牌中有应用专用(application-specific)的代码。
- 在现实中,带有安全UI的令牌对大多数应用来说太昂贵了,也许功能最相近的产品是个人数字助理(PDA)和智能电话。
21.6 生物识别技术
- 我们可以在安全令牌中加入生物识别技术,类似指纹扫描或者虹膜扫描。
- 虽然指纹扫描仪很容易被欺骗,但是在安全性要求不高的方案中是可以考虑应用的。
21.7 单点登录
- 只使用一个主口令,然后用它来给不同应用中的不同口令加密。
- 所有的应用必须与单点登录系统对话,只要应用需要口令,都不应该询问用户,而是由单点登录程序来完成。
21.8 丢失的风险
- 如果安全令牌或者密钥丢失,就会引起严重的后果。
- 我们可以保存密钥的两个副本,一个容易使用,另一个更可靠。如果容易使用的系统忘记了密钥,可以从可靠存储的系统中恢复它。
21.9 秘密共享
- 有一种密码学解决方案能够帮助我们存储密钥,它叫作秘密共享(secret sharing),该方法是把这个秘密分成几个不同的分块,它可能以这样的方式来处理:例如,用5个分块中的3个就可以恢复秘密。那么你可以把分块分给IT部门的每个高级成员,他们中的任何3个人都能恢复秘密。这种方式的技巧就是任意两个人在一起绝对不会知道关于密钥的任何事情。
- 但是在现实生活中,秘密共享方案很少被使用,因为此方案太过复杂。不但应用起来复杂,更重要的是,管理和操作也很复杂。
21.10 清除秘密
21.10.1 纸
- 要清除写在纸上的口令一般是把这张纸销毁。一种可能的方法是烧掉这张纸,然后把灰烬碾成粉末,或者是用水把灰烬混成纸浆,把纸切成碎片也是一种选择。
21.10.2 磁存储介质
- 磁介质是很难清除的,一个比较好的处理方法是用随机数据重复地重写秘密,有以下几点注意要求:
- 每次重写应该使用新的随机数据,
- 一定要在存储秘密的实际位置重写,
- 要保证每次重写是写到磁盘上,而不是写到磁盘缓存中,
- 清除自秘密数据之前开始,且到它之后结束一段区域。
- 使用消磁机来清除磁带或磁盘从理论上说是可行的。然而,现代的高密度磁盘存储介质能够抵抗消磁,因此这不是一个可靠的清除方法,实际上,用户根本弄不到消磁机,因此这也是不现实的。
21.10.3 固态存储
- 用随机数据重复地重写秘密是仅有的一种实际解决方案,但也不是很完美的方案。
- 只要不再使用某种固态设备,最好的方法就是销毁它。