TrueCrypt 使用经验[2]:关于加密盘的密码认证和 KeyFiles 认证

  接着前一篇《关于加密算法和加密盘的类型》的话题,今天说说 TrueCrypt 的两种认证方式:老式的“口令认证”和新式的“Key Files 认证”。
  用过电脑的同学,肯定对密码(口令)的使用非常熟悉了。所以俺就不用再解释基本概念了,只是重点聊一下密码认证的潜在风险和防范措施。
  关于“弱密码的危害”,想必很多同学都听说过。但是有个细节,可能很多人没有意识到。那就是——【弱密码】对磁盘加密的危害更加明显。   咱们拿“操作系统口令”和“加密盘口令”进行对比。   如果某个操作系统做过安全加固,通常会在系统中设置“无效登录的上限”。只要攻击者尝试的无效口令超过这个上限,该用户就会被锁定。但是对于磁盘加密工具而言,无法像操作系统那样,限制无效口令的次数。因为针对加密盘的暴力破解,前提通常是:攻击者已经拿到存储介质(比如:硬盘、U盘、等)。在这种情况下,攻击者可以使用自己的工具进行密码尝试(【不】存在次数限制)。   所以,你的加密盘一旦用了【弱口令】,就很容易遭到暴力破解。   针对加密盘的暴力破解有很多种,本小节所说的是针对”用户密码”的暴力破解。

  对于短密码

  假如你的加密盘仅仅使用口令认证,而且你的口令比较短(比如说小于6个字符)。那么攻击者只要尝试所有的6字符组合,就必然可以试出你的口令。顺便说一下,很多网友用的口令只有小写字母和数字,那么6字符的口令,只有(26+10)的6次方。这个数并不算大,可以被穷举。

  对于特定形式的密码

  所谓的“特定形式密码”,比较典型的例子就是日期(尤其是生日)。这是很多菜鸟常用的【坏习惯】。

  很多不懂技术的同学会有一个错觉:【误以为】用日期做口令,好像长度还比较长(比如 2000-01-01 有10个字符),看起来好像很保险。

  其实捏,用日期做口令是很危险滴!因为常用的日期,大都分布在最近100年的范围内,也就是说,可能性小于 365×100(数量级才几万);即使对每一个日期考虑不同的写法格式(比如 yyyymmdd、yyyy-mm-dd、mm/dd/yyyy、等等)顶多再乘以20倍,连一百万都不到。对于暴力穷举,基本上属于小儿科。   要构造一个又好记又复杂的密码,简直称得上是一门艺术。这里面涉及很多技巧,并不是每个人都懂这些技巧。

  早在2010年,俺就专门写过一篇《如何防止黑客入侵[3]:如何构造安全的口令/密码》,介绍这方面的技巧。那篇旧文写得比较详细。你只要掌握其中的2到3种技巧,就可以构造出【既复杂又好记】的密码。

  关于这个话题,本文就不再啰嗦啦——以免把篇幅拉得太长。   说完密码认证,再来说说 KeyFiles 认证。相对于“密码认证”,这种方式比较新颖,俺多费点口水介绍。   前面提到:使用密码的认证方式,如果密码太简单或太短,就是容易遭暴力破解。而 KeyFiles 认证就避免了这个风险。   对于密码认证,为了对抗暴力破解,需要把密码设置得很复杂又很长。但是万一哪天你自己忘了,那就歇菜啦。 而使用 KeyFiles 进行认证,你只需要记住某个或某几个文件。相对而言,记忆的难度小多了。   针对同一个加密盘,只能设置一个密码,但可以指定【多个】KeyFile 文件。
  基于上述这些优点,俺强烈建议:能用 KeyFile 的场合,尽量用 KeyFiles。如果同时用 KeyFiles 和密码,当然更好。   凡事都有两面性。说完 KeyFiles 的优点,再来说说缺点。
  (在前一篇博文俺有提到)当你用 TrueCrypt 加密系统分区的时候,只能用口令,【没法】用 KeyFile 方式。   对于传统的密码方式,当你输入密码的时候,屏幕上显示的是星号(或圆点)。这种情况下,即使有人偷看你的屏幕,也只能知道密码的长度,而无法知道密码的内容。但如果使用 KeyFiles 方式,在打开加密盘的时候就需要指定某些 KeyFiles,万一有人偷看你的屏幕,就糟糕啦。   (后面会介绍,如何降低偷窥的风险)   关于 KeyFiles 的使用,可以有两种方式: 1. 选择已有的文件作为 KeyFiles 2. 让 TrueCrypt 帮你生成【纯随机】的 KeyFiles   下面分别说说这两种搞法。   理论上,任何一个文件都可以拿来当 KeyFile。但是从密码学角度而言,有的文件适合拿来做 KeyFile,有的不合适。   要达到好的加密效果,KeyFile 至少满足如下特征: 1. 文件内容最好是杂乱无规律(套用信息学的术语,“熵”要尽量大) 2. 最好是二进制文件(一般来说,“二进制”格式的杂乱度比较大) 3. 文件至少超过 1KB(TrueCrypt 的用户手册要求至少 30 字节。但是考虑到你挑选的文件,“熵”未必足够大。所以俺个人建议至少 1KB 比较保险)   虽然俺建议:用【已有】文件作 KeyFile,尺寸至少超过 1KB,但【并不是】越大越好。因为 TrueCrypt 最多只提取 KeyFile 开头一兆字节(1MB)的内容进行处理。所以用太大的文件没意义(文件尺寸在几兆左右,足矣)。   综合考虑这几个因素,日常碰到的文件中,可以考虑用来做 KeyFile 的主要有:某些图片文件(比如 JPG、PNG、GIF、但【别】用 BMP 格式)、某些音乐文件(比如 MP3、WMA、但【别】用 WAV 格式)、各种压缩包(zip、7z、rar、gzip、bzip2、等等)。   上述这几类文件格式,其内容都是基于压缩的,所以“熵值”足够大,适合用于作 KeyFiles;俺特别注明 BMP 和 WAV 不适合作 KeyFile,因为这两种格式通常是不压缩滴。   让 TrueCrypt 生成 KeyFiles,操作其实很简单——在 TrueCrypt 主菜单点“Tools”然后再点“KeyFile Generator”菜单项。会弹出一个对话框,你会看到里面有很多数字在自动变化。这时候你要【随机并迅速】地移动你的鼠标(因为 TrueCrypt 会通过鼠标位置进行采样,以增加随机性)。大约半炷香之后(时间越长,随机性越好),你就可以点对话框下面的“Generate and Save KeyFile”按钮,然后会弹出一个“文件保存对话框”,让你保存刚生成的 KeyFile 到某处。   以下是该方法的优缺点分析。

  优点

  它生成的 KeyFiles 必定符合刚才所说的——具备足够好的加密效果。

  缺点1

  为了让“熵值”足够大,TrueCrypt 采用某种随机算法来生成 KeyFiles(对密码学感兴趣的同学可以参见 TrueCrypt 手册的“Random Number Generator”章节)。因为是随机生成的,所以这个 KeyFiles 几乎一定是全新的。   这里的缺点在于——如果随机生成的 KeyFile 没做备份并且搞丢了,你就惨啦。口令忘了还可以使劲回忆,KeyFile 搞丢了基本上就没辙啦——加密盘就废了,永远也打不开。

  缺点2

  TrueCrypt 生成的 KeyFile 都有个特点,文件大小固定是64字节。这就不利于隐蔽(关于 KeyFiles 的隐蔽性,下面会聊到)。
  对于普通的网友,使用“方案1”(现有文件作 KeyFiles)是比较合适滴。再次啰嗦一下,如果你使用现有文件,一定要按照前面说的经验,以确保你选择的 KeyFiles,其内容的“紊乱度”(熵值)足够大。   对于安全性有特殊需求的同学,可以考虑使用“方案2”(让 TrueCrypt 生成 KeyFiles)。这种方式有一些特殊的用处。比如在本文末尾有提到,还可以用来【对付酷刑逼供】哦。
  总的来说有两种方式存放 KeyFiles: 1. KeyFiles 跟加密盘在同一个电脑中 2. KeyFiles 跟加密盘不在同一个电脑中(比如放在外置的 U 盘)   一般来说,第二种方式虽然稍微麻烦,但安全性更好——即使攻击者偷走你的电脑也拿不到 KeyFiles。   如果你考虑用外置存储的方式放置 KeyFiles,手机是一个不错的选择。用手机存放 KeyFiles 有如下优点: 1. 手机总是随身携带 2. 如今大部分手机都支持 U盘模式   前面说了,使用现有的文件当 KeyFiles,隐蔽性比较好。而且也说了,使用手机做外部存储比较好。   下面就来说说,这种情况下,如何增加隐蔽性。   以音乐文件为例   很多人的手机上都会存放一些歌曲(比如 MP3)。如今的智能手机,存储空间都以 GB 为单位,能轻松存放上千首(甚至上万首)歌曲。那么你可以从这些歌曲中挑选某几首,来作为你的 KeyFiles。挑选的歌曲最好是让你印象深刻的(可以是特别喜欢的,也可以是特别讨厌的)。这么干有如下几个优点: 1. 隐蔽性足够好(手机上存储音乐文件是很常见滴。即使你被六扇门逮捕,朝廷走狗检查你的手机,也不会起疑心) 2. 印象深刻的歌曲,不容易记错。 3. 在成百上千首歌曲中挑选某几首歌曲做 KeyFiles,穷举的难度非常大(下面会提到)。   虽然俺举的是音乐文件的例子,但在实际操作过程中,你可以自己变通一下——比如把音乐文件换成图片文件,效果也差不多。   前面说了,TrueCrypt 支持同一个加密盘用多个 KeyFiles。那么,KeyFiles 的个数设定为几个比较好捏?俺个人建议,设定为 5至10 个。   增加 KeyFile 的个数,在某种情况下会加大攻击者的难度。还拿刚才那个例子来说事儿:   假设你的手机上有一个音乐目录,里面有300首歌曲(这不算多),然后你任意挑选其中6个做加密盘的 KeyFiles。再假设攻击者(通过某种方式)知道你用这个目录里的音乐文件作 KeyFiles。那么攻击者就企图用穷举方式,尝遍该目录下所有文件的组合。那么他/她需要尝试多少次捏?   因为攻击者并不知道你选择了几个文件,所以要先穷举1个文件的组合、然后是2个文件的组合、3个文件的组合……(以此类推,直到穷举成功或放弃)   如果俺没记错的话,计算排列组合总数,算式大概如下 300挑1的组合——这个不用算,就是300种

300挑2的组合——(300×299)/(2×1)

300挑3的组合——(300×299×298)/(3×2×1)
300挑4的组合——(300×299×298×297)/(4×3×2×1) ……   从上面这个例子可以看出—— “KeyFiles 的数目”只是略微增加,排列组合的总数会猛增到【天文数字】。但 KeyFiles 也不是越多越好——因为还要考虑自己遗忘或记错的风险。所以俺觉得,【4至8个】是比较合适的平衡点。

  因为 TrueCrypt 是根据 KeyFile 的内容来生成认证信息。所以你一定要确保:每个 KeyFile 文件【内容不变】。如果某个 KeyFile (开头1MB)的内容被改动过,下次你用这个文件登录,就会失败。   (至于 KeyFile 的“文件名”或“存放目录”,可以随便改,没关系)   TrueCrypt 有一个功能叫“Default KeyFiles”。使用这个功能,你可以指定某些文件作为默认的 KeyFiles。指定了之后,你每次打开某个加密盘,都会自动使用这些 KeyFiles 啦。

  优点

1. 提供了便捷性(不用每次打开加密盘都选择 KeyFiles) 2. 防止偷窥

  缺点及解决方法

1. 灵活性不够(所有的加密盘都会依赖于默认的 KeyFiles)。

2. 如果攻击者通过某种方式(比如植入木马)拿到你的 TrueCrypt 配置文件(位于 %APPDATA%\TrueCrypt 目录下的 Configuration.xml),就会知道你的默认 KeyFiles 放在哪个目录。

  要防止缺点1   TrueCrypt 的配置文件是基于当前的【操作系统用户】。可以通过创建多个操作系统用户,来增加灵活性。   要防止缺点2   你可以在“默认 KeyFiles”的基础上,再为某个加密盘指定【额外的】KeyFiles。这样一来,即使攻击者知道你的默认 KeyFiles,也【无法知道】额外的 KeyFiles。

  本来这篇博文已经写完了。但是看到某读者在前一篇博文的留言,提到说:不管 TrueCrypt 的技术有多好,都无法对付酷刑逼供。所以俺再额外补充一个小节,说说“如何用 KeyFiles 应对酷刑逼供”。   不管哪种酷刑逼供,要想得手,都有个前提条件——受刑的人【确实知道】某些信息。   如果你的加密盘使用 KeyFiles 认证,并且这个 KeyFiles 是由 TrueCrypt 随机生成的。那么,只要你在被捕之前,来得及【销毁】KeyFiles(包括其备份),之后的酷刑逼供对你就没有用啦!因为 TrueCrypt 随机生成的 KeyFiles,连你本人也不知道文件内容。这种情况下,酷刑逼供是没有用滴。   这个招数的难点在于:咋样才能及时销毁 KeyFiles?

  关于这方面的技术及经验,俺在6年后(2019)又写了一篇教程《如何用“磁盘加密”对抗警方的【取证软件】和【刑讯逼供】,兼谈数据删除技巧》。

回到本系列目录

俺博客上,和本文相关的帖子(需翻墙)

TrueCrypt——文件加密的法宝
扫盲 VeraCrypt——跨平台的 TrueCrypt 替代品
如何用“磁盘加密”对抗警方的【取证软件】和【刑讯逼供】,兼谈数据删除技巧
文件加密的扫盲介绍
扫盲文件完整性校验——关于散列值和数字签名