10.4 加密数据存储
用于存储的加密数据、以后可以在Alice-Bob模式里检查。Alice仍可向 Bob发送消息,只是此处的“Bob”是某时间后的Alice。然而,该问题又有本质的不同。
在通信信道里,传输中的数据并没有价值。如果Bob不接收某个特定消息,Alice将一直发送下去。这对于用存储的数据加密来说是不正确的。如果Alice不能对她的消息进行解密,她将不能回过头去重新加密。或许她会永远地失去这些数据。这就意味着用于数据存储的加密实现应该有某些机制,以防止由于密文中的错误引起的不可恢复。
加密密钥有着与加密消息同样的价值,只是它小一点罢了。事实上,加密就是将大秘密变成小秘密。由于较小,所以它更容易丢失。密钥管理程序应当假定同一个密钥可以被一遍又一遍地使用,并且数据可以在磁盘上保存数年,直到被销毁。
此外,密钥应该保存很长一段时间。用于通信的密钥,理想化的仅存在通信维持时间。而用于数据存储的密钥则需要数年,因此必须安全地保存数年。
文献[357]列出针对计算机数据加密存储的其它一些问题:
——数据可以以明文形式存在,或者在别的磁盘上、或者计算机、或者就写在纸上。对密码分析者来说进行已知明文攻击有很大的机会。
——在数据库应用中,数据片比大多算法的数据分组小。这会使得密文比明文要大。
——I/O设备的速度要求快速的加解密,这可能需要硬件加密。在一些应用中,可能需要特殊的高速算法。
——需要安全,长期的密钥储存。
——密钥管理更复杂,因为不同的人需要存取不同的文件,或同一文件的不同部分等。
如果加密文件不是以记录和字段构造(象文本文件),恢复将很容易:整个文件在使用之前进行解密。如果加密文件是数据库文件,解决会有很多问题。为存取单个记录而解密整个数据库文件是无效率可言的,但独立地加密各个记录又容易受到分组重放之类的攻击。
另外,你必须确认加密后未加密的文件已删除(见10.9节),进一步的细节、研究请参见文献[425,569]。
非关联化密钥
当对一个大的硬盘驱动器进行加密时,有两种方法。你可以用一个单独的密钥对所有数据进行加密。但这给分析者提供了大量用于分析的密文,并使多个用户只查看驱动器的一部分成为不可能。或者,你可以用不同的密钥对各个文件进行加密,这迫使用户去记住每个文件的密钥。
解决办法是使用独立的密钥对每一个文件进行加密,然后用一个各个用户都知道的密钥加密这些密钥。每个用户只须记住一个密钥,不同的用户可以有一个用他们的密钥加密的文件加密密钥子集。并用主密钥对每一个文件加密密钥加密。这会更加安全,因为文件加密密钥是随机的,并对字典攻击不敏感。
驱动器级与文件级加密
有两种方法加密硬盘驱动器:文件级和驱动器级。文件级加密是指每一个文件被单独加密。为了使用被加密的文件,你必须先解密,再使用,再重新加密。
驱动器级加密保持在用户的一个逻辑驱动器上,对所有的数据加密。如果做得好,可以提供很好的安全性,它比选择好的通信字更安全,不需要为用户担心。然而,因为必须要处理一些诸如驱动器的安装、文件新扇区的划分、文件老扇区的反复应用、逻辑磁盘上的数据的随机存取和更新请求等,所以这个驱动器级加密肯定比单一的文件加密程序复杂得多。
标准情况是,启动前驱动器会提示用户输入一个口令,它被用来生成解密主密钥,然后用主密钥解密真正的不同数据的解密密钥。
提供加密驱动器的随机存取
大多数系统都期望能够随机存取单个磁盘扇区。这给任何链接模式下使用许多序列密码和分组密码增加了不少难度。有很多可能的解决办法。
可以使用扇区的地址为每一个被加/解密的扇区生成一个唯一的IV。缺点就是每一个扇区将一直用同一个IV进行加密。确信这不是一个安全问题。
为了得到主密钥,可生成一个与某个扇区同样大小的伪随机分组。(例如,运行OFB模式下的某个算法可以做到这个。)为了加密任何扇区,先与该伪随机分组相异或,然后用ECB模式正常地加密。该方法被叫做“ECB+OFB”(参见15.4节)。
由于CBC和CFB模式是错误恢复模式,所以你可以用扇区上除了第一和第二个分组的所有数据为该扇区产生一个IV。例如,扇区3001的IV可以是扇区除了前128比特的所有数据的Hash函数。产生该IV后,可以正常的在CBC模式下进行加密了。为了对该扇区解密,把扇区的第二个64-比特分组作为一个IV,然后对扇区的其余部分进行解密,接着,利用解密的数据,重新生成一个IV ,再对第一个128比特解密。
你可以使用有很大分组尺寸的分组密码算法,这样就可以一次对整个扇区完成加密。Crab(参见14.6节)是一个例子。
表 10.5 文件级加密与驱动器级加密的比较
|
文件级加密 |
驱动器加密 |
好处 |
易实现,易使用 相对小的不利结果 用户可以在不同机器间无问题的移动文件 用户可无问题的对文件做备份 |
暂时文件,工作文件等可在安全驱动器里存储 在这种系统里很难忘记重复加密
|
安全问题 |
通过无安全意识程序存在潜在泄露量(如,为了暂存将文件写入磁盘) 差劲的程序实现会对同一个口令用相同的密钥重复加密 |
用一个设备驱动器或抗内存程序会使一些事情出错 差劲的程序实现允许了选择明文或选择密文攻击 如果一个系统用一个口令加密,丢失它意味着攻击者得到了任何一切 很有限的密码算法可以使用,如,OFB序列密码就不能工作 |
可用性 |
用户必须计算怎样去做 对不同的文件可能有不同的口令 所选文件的手工加密是唯一的存取控制 |
存在性能缺陷 该驱动器可在Windows,OS/2 DOS,设备驱动器等间神奇地相互作用 |