TrueCrypt 使用经验[3]:关于加密盘的破解和防范措施
程序员文章站
2022-11-03 19:54:33
本来第三篇想写隐藏卷相关的经验。但是看到好几个读者在留言中提及加密盘的破解,所以俺先来说说和破解有关的话题以及防范措施。
★各种暴力破解(穷举)
◇针对密码/口令的...
本来第三篇想写隐藏卷相关的经验。但是看到好几个读者在留言中提及加密盘的破解,所以俺先来说说和破解有关的话题以及防范措施。
★各种暴力破解(穷举)
◇针对密码/口令的穷举破解
关于这个话题,在前一篇博文已经介绍了穷举的原理和防范的措施。所以,今天就不再啰嗦了。
◇针对 KeyFiles 的穷举破解
这分两种情况:已知 KeyFiles 的范围、未知 KeyFiles 范围。
已知 KeyFiles 的范围
啥是"已知 KeyFiles 范围",举个例子:假设你把 KeyFiles 存储到 U盘。然后攻击者通过某种方式知道你的 KeyFiles 都在 U盘上,并且攻击者拿到了你的 U盘。这就属于"已知 KeyFiles 范围"的穷举破解。这种情况下,攻击者可以把 U盘 上的所有文件进行各种组合,对每一种组合进行尝试。
那么,这种场景下的攻击,是否能得手捏?取决于如下三点:
1. 你是单独使用 KeyFiles 认证,抑或是组合 KeyFiles 和密码的双因素认证
2. 该范围内的文件数有多少
3. 加密者选了多少个文件作为 KeyFiles
对第一点,如果你用了双重认证,光穷举 KeyFiles 是没用滴;至于后两点,是共同起作用滴。就拿刚才 U盘 的例子。如果 U盘 内的文件数很多并且加密者同时选择了好几个文件做 KeyFiles,那么暴力穷举的次数会成为天文数字。前一篇博文给出了具体的计算公式和例子,这里就不再浪费口水啦。
由此可见,"已知 KeyFiles 范围"的穷举破解,应用场合和有限,不会构成太大威胁。
未知 KeyFiles 的范围
这种情况下,暴力穷举 KeyFiles 是不可能滴。因为任何一个文件都可以拿来当 KeyFiles,世上有那么多文件,怎么可能穷举得完?
有些天真的同学会说,TrueCrypt 仅仅使用 KeyFiles 开头 1MB 的内容参与加密,那么,有没有可能穷举大小在一兆以内的所有文件捏?俺可以大致帮你算一下,大小在一兆以内的所有文件,总共有多少种可能(不喜欢数学的同学,请略过计算内容,直接看下一章节)。
大小是 1字节 的文件,所有的可能性是 2 的 8 次方(记作 2^8,下同)。为啥是 2^8 捏?因为一个字节有 8 个比特,每个比特可以有 0 或1 两种可能。
以此类推,
大小是 2字节 的文件,所有的可能性是 2^16 = 65536
大小是 3字节 的文件,所有的可能性是 2^24 = 16777216
大小是 4字节 的文件,所有的可能性是 2^32 = 4294967296(约43亿)
大小是 5字节 的文件,所有的可能性是 2^40 = 1099511627776(约1万1千亿)
大小是 6字节 的文件,所有的可能性是 2^48 = 281474976710656(约281万亿)
......
上述计算可以看出,每增加一个字节,可能性的总数就增加256倍。仅仅才到 6字节,可能性就已经超过两百万亿。大小是 1MB 的文件,会有大约100万字节,你自己盘算一下吧,会有多少种可能性。
而且上述的计算,仅仅是针对单个 KeyFiles 的情况。如果用户同时使用多个 KeyFiles,嘿嘿......
所以捏,在未知范围的情况下穷举 KeyFiles,还不如直接去穷举密钥(下面就来介绍密钥的穷举)。
◇针对密钥的穷举破解
什么是密钥
密钥说白了就是一段数据,可以用来加密或者解密。TrueCrypt 使用的加密算法都是"对称加密算法"。这种算法的特点是:加密密钥和解密密钥是同一个。假设你用密钥 K 把一段明文 P 变成密文 C,那么你同样可以用 K 把 C 变为 P。
除了对称加密,还有一类加密叫做"非对称加密"——加密密钥和解密密钥是不同滴。因为跟本文无关,对"非对称加密"就不展开了。
很多不懂技术的网友经常混淆密钥和密码,其实这两者是完全不同滴:
1. 密钥是直接参与加密运算的,而密码不是。
2. 密码的作用是保护密钥(下面会提到)
加密盘的密钥是怎么来滴?
简单地说,加密盘的密钥是根据你输入的口令和 KeyFiles,通过某种复杂的数学运算得到的(密码学术语叫"密钥生成函数")。在密钥生成函数中,会用到哈希运算(这篇博文有 Hash 的扫盲)和多次迭代。其效果就是:只要你输入的口令或者 KeyFiles 有一丁点的差异(例如一个比特的差异),产生的密钥也完全不同。
顺便说一下,当你创建加密盘的时候,TrueCrypt 除了让你选择加密算法,还让你选择哈希算法。为啥要选哈希算法捏?其中一个用途就是参与"密钥生成函数"的运算。
(刚才只是简单地说,如果要细说的话,TrueCrypt 的加密和解密过程还涉及头部密钥和主密钥。由于 TrueCrypt 采用的是 XTS 操作模式,所以头部密钥有一对,主密钥也有一对。如果选的是多重加密算法,主密钥就会有N对。这些都属于技术细节,普通网友不需要知道太多,俺就不深入聊了)
穷举密钥的难度
虽说穷举密钥的难度比穷举 KeyFiles 的难度要小很多。但穷举密钥的可能性,依然是天文数字。
目前 TrueCrypt 内置的三种加密算法,都使用 256 比特的密钥(256 比特 = 32字节)。对于 256 比特的密钥,其所有的可能性是2的256次方。这是一个天文数字,要进行这么多次的穷举(每一次穷举都有一定的运算量),拿现有的超级计算机的运算能力,估计也没戏。
别混淆不同加密类型的密钥长度
前2个月有个新闻,说 Google 开始把 HTTPS 证书的密钥升级到 2048位,因为 Google 担心 1024位的密钥不够安全。
估计某些不太懂的读者也看到了这个新闻,然后就会来质疑俺:256比特的密钥到底是否可靠?
请注意,当谈论 HTTPS 证书的密钥长度,指的是"非对称加密算法"(通常是RSA算法)的密钥长度。而 TrueCrypt 使用的是"对称加密算法"。对称加密和非对称加密是完全不同的两种东西,两者的密钥长度没有可比性。(这就如同 铅球的世界纪录 跟 标枪的世界纪录 没有可比性)
◇小结
前面说的这几种穷举破解,只有一种是可行的,那就是基于密码/口令的穷举。所以俺再啰嗦两句:
1. 加密盘的密码/口令一定要足够复杂(具体方法请看前一篇博文)
2. 能用 KeyFiles 的地方,尽量用 KeyFiles 组合密码,构造双重认证
★针对加密算法的攻击
所谓"针对加密算法的攻击",就是利用算法本身的漏洞。从而找到某种快速解密的方法。目前 TrueCrypt 使用的加密算法分别是:AES、Twofish、Serpent。它们会不会有漏洞捏?
在本系列第一篇,俺特地花不少口水来介绍这三种加密算法。十多年前,美国国家标准局(NIST)公开招标21世纪的新一代加密算法标准(也就是 AES),这三个算法都是最后一批候选者,其中之一的 Rijndael 更是有幸成为 AES。
从那之后,世界上有非常多的密码专家对这些候选者(尤其是 Rijndael )进行了深入的研究。到目前为止,并没有发现明显的漏洞可以被利用。
退一百步讲,即使某个算法将来被发现有漏洞,只要你创建加密盘的时候,使用的是多重加密,问题就不大了。
目前 TrueCrypt 支持的多重加密有如下几种:
AES-Twofish
Serpent-AES
Twofish-Serpent
AES-Twofish-Serpent
Serpent-Twofish-AES
某些爱抬杠的读者会问,如果三个算法都被发现漏洞,咋办?俺觉得吧,这种概率非常非常非常小,完全不必为这种小概率的事情浪费心情。
★盗取内存中的密钥
(虽然前面说过了,俺还是要再啰嗦一句:密钥和密码是两回事)
从严格意义上讲,这种方式属于"盗取",而不是"破解"。之前好几个读者在留言中提到 TrueCrypt 的取证工具,号称能破解 TrueCrypt 加密盘。其实这些所谓的"破解",都仅仅是盗取。而且捏,要想成功盗取密钥,需要好几个前提条件。
◇概述
TrueCrypt 为了确保安全性,是不会把加密盘的密钥存储到硬盘上的。但是为了进行实时的加密解密,密钥必然会放在内存中。所以,攻击者如果能拿到整个操作系统的内存,并对内存进行分析,就有可能(不是"一定")找到密钥。
大伙儿请注意:
通过分析内存拿到密钥,有一个前提:必须是加密盘尚未卸载(umount)。当你把某个加密盘卸载(umount)的时候,TrueCrypt 就会把该加密盘在内存的密钥清空。换句话说,如果你所有的加密盘都已经正常卸载了,内存中就不含有 TrueCrypt 的密钥了。
但是"系统加密分区"是无法卸载的(上面跑着操作系统呢),所以,只要你加密了系统分区,就只能依靠正常关机来防止别人偷窥内存中的密钥。
那么,如何才能拿到操作系统的内存?攻击者可以来软的,也可以来硬的。来软的(软件方式)有3招:虚拟内存文件、休眠文件、内存转储文件;来硬的(硬件方式)有2招:冷启动攻击、DMA攻击。
下面俺逐一介绍这几种破解方式和防范措施。
除了这几种方式,其实也可以利用木马来盗取系统的内存。比如说,你的系统被植入一个很牛B的木马,理论上可以通过木马去 Dump 整个系统的内存。但是捏,既然攻击者已经植入了木马,就没必要去 Dump 内存来分析了——这么干太费劲啦,简直是舍近求远。有了木马,攻击者直接就可以利用木马来偷窥你的密码和 KeyFiles。所以,木马的情况俺放到后面的 "★盗取密码和 KeyFiles" 章节再来介绍。
◇虚拟内存文件
原理介绍
稍微熟悉 Windows 的同学,都知道 Windows 有一个虚拟内存文件。而且可以通过设置,把这个虚拟内存文件同时放到几个不同的分区上。
假如你存放虚拟内存的那几个分区没有加密,假如攻击者能够拿到你的硬盘,假如攻击者接触到硬盘的时候你的加密盘还没有卸载。当这3个"假如"同时成立,攻击者通过分析虚拟内存文件,有可能(不是"一定")拿到加密盘的密钥。
防范措施
1. 手动设置虚拟内存文件的存放位置,而不要让操作系统自动管理虚拟内存文件的存储位置。
2. 确保你存放虚拟内存文件的那些分区,都已经被加密了。
◇休眠文件
原理介绍
从 Windows 2000 开始,就提供了休眠功能。当操作系统休眠时,会把整个系统的内存写到系统分区根目录的某个文件。
假如你在打开加密盘的情况下休眠系统,假如你的系统分区没有加密,假如攻击者能够拿到你硬盘上的休眠文件。当这3个"假如"同时成立,那么攻击者通过分析休眠文件,有可能(不是"一定")拿到加密盘的主密钥。
防范措施
防范措施很简单,下面两招二选一:
1. 不要使用休眠功能,每次都正常关机
2. 加密系统分区
◇内存转储文件
原理介绍
在很早以前(大概是 Windows NT 3.1),Windows 系统就提供了内存转储功能。当操作系统崩溃的时候(比如系统蓝屏),内存转储功能会把崩溃这一瞬间的内存转储到硬盘上。当初提供这个功能,主要是为了便于微软的程序员排查系统崩溃的故障(早些年,Windows 蓝屏几乎是家常便饭)。
但是攻击者可以利用 Windows 的这一机制,人为触发一个系统崩溃,然后就可以拿到整个内存的转储文件。
假如你开启了"完全内存转储",假如在打开加密盘的情况下系统崩溃,假如你的系统分区没有加密,假如攻击者能够拿到你硬盘上的休眠文件。当这4个"假如"同时成立,那么攻击者通过分析转储文件,就能拿到加密盘的主密钥。
防范措施
Windows 的内存转储功能是可以手工禁用的。方法如下:
对于 Vista 之前的版本(Win2000、WinXP、Win2003)
以管理员身份登录到系统,在桌面上"我的电脑"点右键,快捷菜单上选"属性"。会弹出一个属性对话框,选"高级"标签页。下面有一个栏目是"启动和故障恢复",点"设置"按钮。会弹出第二个对话框,下面有个"写入调试信息"的下拉框。把这个下拉框选择成"不转储",然后点"确定"。
对于 Vista 之后的版本(Vista、Win7、Win8)
以管理员身份登录到系统,打开资源管理器,在"我的电脑"上点右键,快捷菜单上选"属性"。会弹出一个新窗口。在左侧栏选"高级系统设置",会弹出一个对话框。后面的操作就跟 WinXP 一样了。
◇冷启动攻击(cold boot attack)
这个攻击手法比较高级,能够实现这种攻击手法的人,需要配有专门的设备。假如俺没记错的话,此招数应该是2005年之后才开始在安全界流传。如果是5年前写此文,可能就不会写这一章节了。因为那时候六扇门的取证部门,很多还没有这个技术实力。但是最近几年,已经开始陆续具备这种技术实力了。
不过捏,也别太担心。如果你只是普通的网民,估计你还享受不到这种级别的攻击 :)
原理介绍
很多人都以为,断电之后,内存中就不会有数据了。其实不然!从断电到内存中的数据完全消失,存在一个数据滞留的时间差。而且这个时间差是依赖于温度的。如果把温度降到一定程度,这个时间差可以超过10分钟(至于多低的温度可以达到多长的时间差,跟具体的内存条规格有关,也跟主板型号有关)。
10分钟的时间差,已经足够让攻击者完成如下一系列动作:
1. 硬关机(拔电源)
2. 插上电源,重新启动
3. 进入 BIOS 设置界面,设为 U盘启动
4. 插入一个专门的 U盘
5. 利用 U盘上特制的软件,把整个内存保存到 U盘上
关于"冷启动攻击"的更多介绍,可以看洋文*(很详细哦),链接在"这里"。
防范措施
(只有对安全性要求很高的同学,才需要考虑"冷启动攻击")
要防范冷启动攻击,其实也不难。当你要长时间离开自己的电脑时,不要使用"待机"或者"锁定"(当然更不能使用"休眠"),要正常关机。正常关机的时候,TrueCrypt 会正常退出。在 TrueCrypt 正常退出之前,它会先清空储存密钥的内存位置。
补充说明:
正常关机主要是为了清除"系统加密分区"的密钥。
对于非系统加密分区或者逻辑加密盘,只要把某个加密盘卸载(umount),TrueCrypt 就会把该加密盘在内存的密钥清空。但是"系统加密分区"是无法卸载的(上面跑着操作系统呢),所以只能依靠正常关机。
◇DMA攻击(DMA attack)
原理介绍
这种攻击方式比冷启动攻击更新颖,应该是最近2-3年才出现的。
熟悉硬件的同学应该听说过 FireWire 硬件接口(俗称"火线接口",也叫 IEEE 1394 接口)。这玩意儿支持 DMA 方式直接操作物理内存。所以攻击者如果能物理接触你的电脑,可以在你的电脑上插入一个 FireWire 接口的设备,然后利用 DMA 的方式直接读取整个系统的内存。这种方式不仅仅是理论上可行,实际上已经有人搞了现成的 DMA 攻击工具——Inception
更多相关介绍,可以看洋文*,链接在"这里"。
防范措施
(只有对安全性要求很高的同学,才需要考虑"DMA 攻击")
前面提到的"冷启动攻击"的防范措施,也可以用来防范 DMA 攻击。另外,可以通过禁用 1394 接口的 DMA 模式防范这种攻击。根据微软官方文档(链接在"这里"),所有版本的 Windows 默认都是禁用 1394 接口的 DMA 模式。所以这种攻击的风险不算太大。
★盗取密码和 KeyFiles
◇通过木马盗取
原理介绍
如果你的系统被攻击者植入了木马,那么攻击者就可以利用木马来偷窥你的口令输入和 KeyFiles 输入。一旦拿到加密盘的口令和 KeyFiles,攻击者就可以轻松打开加密盘。
防范措施
从上面的介绍可以看出:确保本机的安全是至关重要的!
关于如何防范骇客植入木马,又是一个很大的话题——显然不可能在这里细聊。
◇通过替换 Boot Loader 盗取
原理介绍
对于系统盘加密或者全盘加密,TrueCrypt 会在硬盘的引导扇区(或主引导扇区)放一个定制的 Boot Loader。当你的系统启动时,会首先加载 TrueCrypt 的这个 Boot Loader,然后它会提示你输入密码。
如果攻击者可以物理接触到你的电脑,就有可能采用软件方式,用一个伪造的 Boot Loader 替换掉原来正宗的 Boot Loader。然后这个假的 Boot Loader 也会装模作样地提示你输入密码。再把你输入的密码转交给那个真的 Boot Loader,同时把密码保存在某个地方。
这样一来,攻击者就可以利用这个假的 Boot Loader,拿到你的密码。
防范措施1——BIOS 硬盘锁
对于笔记本电脑,如果 BIOS 支持的话,建议增加一个硬盘锁的口令。这样一来,即使攻击者拿到你的电脑,取出硬盘,也无法看到里面的内容。
提醒一下
不同品牌的笔记本,硬盘锁的机制是不同的。有的靠谱,有的不靠谱。一般规律是:越有实力的厂商,硬盘锁的安全性也越高。
其次要注意的是:如果你要防的是天朝的六扇门,最好不要用大陆品牌的笔记本。大陆品牌的笔记本,其硬盘锁可能会留有后门给*和国安使用。
防范措施2——使用 U盘 引导
这个招数比较适合于 Linux 之类的系统。你可以把整个系统安装到一个小小的 U盘上。然后把 U盘带在身边。每次开机就插入该 U盘来启动操作系统。
这种情况下,就不需要使用"加密系统分区"(因为系统分区已经在 U盘上了),自然也就不依赖硬盘的 Boot Loader。
◇其它盗取口令和 KeyFiles 的招数
上述介绍的,都是比较常见的,也比较容易实施的攻击手法。除了这几招之外,还有若干冷门的招数,也可以用来盗取密码或 KeyFiles。比如 基于硬件的"Key Logger"、比如 基于硬件的"边信道攻击"、等等。
这些招数比较罕见,而且需要有专门的硬件设备。如果你只是普通网民,那是没有资格享受到这种级别的攻击滴。通常只有商业间谍、军事间谍、政治间谍才会使用这类手段,用来对付重要人物。
而且考虑到篇幅已经比较长了,俺就不深入介绍这些冷门的手法了。
★总结
在 TrueCrypt 的产品手册中,作者已经明确指出:如果无法确保电脑的物理安全,那即使采用 TrueCrypt 也无法保证数据的保密性。在这种情况下泄密,不能算 TrueCrypt 的责任。
所以,确保物理安全是第一步。
其次,TrueCrypt 的手册还说了,如果你无法确保操作系统安全,那 TrueCrypt 也无法保护你的数据。比如前面提到的:植入木马可以偷窥你的口令。这种情况下是任何软件(包括杀毒软件)都无法彻底防范的。
所以,确保操作系统自身的安全是第二步。
天朝六扇门的人要想解开 TrueCrypt 加密盘,通常也是采用这两条路——要么从物理安全入手,要么从操作系统安全入手。到目前为止,没有任何公开的资料能够给出方法,用来快速突破TrueCrypt 本身的防线。暴力破解虽然可以突破 TrueCrypt 的防线,但非常非常非常"慢"。
目前那些号称能破解 TrueCrypt 的软件,基本上都是采用内存 Dump 的方式。这种方式的可用性比较差——如果拿不到"系统内存",这些破解软件完全没辙。
综上所述,只要你根据本系列介绍的经验,对 TrueCrypt 使用得当,TrueCrypt 加密盘的安全性是非常有保障的——至少对普通网民已经是足够了
★各种暴力破解(穷举)
◇针对密码/口令的穷举破解
关于这个话题,在前一篇博文已经介绍了穷举的原理和防范的措施。所以,今天就不再啰嗦了。
◇针对 KeyFiles 的穷举破解
这分两种情况:已知 KeyFiles 的范围、未知 KeyFiles 范围。
已知 KeyFiles 的范围
啥是"已知 KeyFiles 范围",举个例子:假设你把 KeyFiles 存储到 U盘。然后攻击者通过某种方式知道你的 KeyFiles 都在 U盘上,并且攻击者拿到了你的 U盘。这就属于"已知 KeyFiles 范围"的穷举破解。这种情况下,攻击者可以把 U盘 上的所有文件进行各种组合,对每一种组合进行尝试。
那么,这种场景下的攻击,是否能得手捏?取决于如下三点:
1. 你是单独使用 KeyFiles 认证,抑或是组合 KeyFiles 和密码的双因素认证
2. 该范围内的文件数有多少
3. 加密者选了多少个文件作为 KeyFiles
对第一点,如果你用了双重认证,光穷举 KeyFiles 是没用滴;至于后两点,是共同起作用滴。就拿刚才 U盘 的例子。如果 U盘 内的文件数很多并且加密者同时选择了好几个文件做 KeyFiles,那么暴力穷举的次数会成为天文数字。前一篇博文给出了具体的计算公式和例子,这里就不再浪费口水啦。
由此可见,"已知 KeyFiles 范围"的穷举破解,应用场合和有限,不会构成太大威胁。
未知 KeyFiles 的范围
这种情况下,暴力穷举 KeyFiles 是不可能滴。因为任何一个文件都可以拿来当 KeyFiles,世上有那么多文件,怎么可能穷举得完?
有些天真的同学会说,TrueCrypt 仅仅使用 KeyFiles 开头 1MB 的内容参与加密,那么,有没有可能穷举大小在一兆以内的所有文件捏?俺可以大致帮你算一下,大小在一兆以内的所有文件,总共有多少种可能(不喜欢数学的同学,请略过计算内容,直接看下一章节)。
大小是 1字节 的文件,所有的可能性是 2 的 8 次方(记作 2^8,下同)。为啥是 2^8 捏?因为一个字节有 8 个比特,每个比特可以有 0 或1 两种可能。
以此类推,
大小是 2字节 的文件,所有的可能性是 2^16 = 65536
大小是 3字节 的文件,所有的可能性是 2^24 = 16777216
大小是 4字节 的文件,所有的可能性是 2^32 = 4294967296(约43亿)
大小是 5字节 的文件,所有的可能性是 2^40 = 1099511627776(约1万1千亿)
大小是 6字节 的文件,所有的可能性是 2^48 = 281474976710656(约281万亿)
......
上述计算可以看出,每增加一个字节,可能性的总数就增加256倍。仅仅才到 6字节,可能性就已经超过两百万亿。大小是 1MB 的文件,会有大约100万字节,你自己盘算一下吧,会有多少种可能性。
而且上述的计算,仅仅是针对单个 KeyFiles 的情况。如果用户同时使用多个 KeyFiles,嘿嘿......
所以捏,在未知范围的情况下穷举 KeyFiles,还不如直接去穷举密钥(下面就来介绍密钥的穷举)。
◇针对密钥的穷举破解
什么是密钥
密钥说白了就是一段数据,可以用来加密或者解密。TrueCrypt 使用的加密算法都是"对称加密算法"。这种算法的特点是:加密密钥和解密密钥是同一个。假设你用密钥 K 把一段明文 P 变成密文 C,那么你同样可以用 K 把 C 变为 P。
除了对称加密,还有一类加密叫做"非对称加密"——加密密钥和解密密钥是不同滴。因为跟本文无关,对"非对称加密"就不展开了。
很多不懂技术的网友经常混淆密钥和密码,其实这两者是完全不同滴:
1. 密钥是直接参与加密运算的,而密码不是。
2. 密码的作用是保护密钥(下面会提到)
加密盘的密钥是怎么来滴?
简单地说,加密盘的密钥是根据你输入的口令和 KeyFiles,通过某种复杂的数学运算得到的(密码学术语叫"密钥生成函数")。在密钥生成函数中,会用到哈希运算(这篇博文有 Hash 的扫盲)和多次迭代。其效果就是:只要你输入的口令或者 KeyFiles 有一丁点的差异(例如一个比特的差异),产生的密钥也完全不同。
顺便说一下,当你创建加密盘的时候,TrueCrypt 除了让你选择加密算法,还让你选择哈希算法。为啥要选哈希算法捏?其中一个用途就是参与"密钥生成函数"的运算。
(刚才只是简单地说,如果要细说的话,TrueCrypt 的加密和解密过程还涉及头部密钥和主密钥。由于 TrueCrypt 采用的是 XTS 操作模式,所以头部密钥有一对,主密钥也有一对。如果选的是多重加密算法,主密钥就会有N对。这些都属于技术细节,普通网友不需要知道太多,俺就不深入聊了)
穷举密钥的难度
虽说穷举密钥的难度比穷举 KeyFiles 的难度要小很多。但穷举密钥的可能性,依然是天文数字。
目前 TrueCrypt 内置的三种加密算法,都使用 256 比特的密钥(256 比特 = 32字节)。对于 256 比特的密钥,其所有的可能性是2的256次方。这是一个天文数字,要进行这么多次的穷举(每一次穷举都有一定的运算量),拿现有的超级计算机的运算能力,估计也没戏。
别混淆不同加密类型的密钥长度
前2个月有个新闻,说 Google 开始把 HTTPS 证书的密钥升级到 2048位,因为 Google 担心 1024位的密钥不够安全。
估计某些不太懂的读者也看到了这个新闻,然后就会来质疑俺:256比特的密钥到底是否可靠?
请注意,当谈论 HTTPS 证书的密钥长度,指的是"非对称加密算法"(通常是RSA算法)的密钥长度。而 TrueCrypt 使用的是"对称加密算法"。对称加密和非对称加密是完全不同的两种东西,两者的密钥长度没有可比性。(这就如同 铅球的世界纪录 跟 标枪的世界纪录 没有可比性)
◇小结
前面说的这几种穷举破解,只有一种是可行的,那就是基于密码/口令的穷举。所以俺再啰嗦两句:
1. 加密盘的密码/口令一定要足够复杂(具体方法请看前一篇博文)
2. 能用 KeyFiles 的地方,尽量用 KeyFiles 组合密码,构造双重认证
★针对加密算法的攻击
所谓"针对加密算法的攻击",就是利用算法本身的漏洞。从而找到某种快速解密的方法。目前 TrueCrypt 使用的加密算法分别是:AES、Twofish、Serpent。它们会不会有漏洞捏?
在本系列第一篇,俺特地花不少口水来介绍这三种加密算法。十多年前,美国国家标准局(NIST)公开招标21世纪的新一代加密算法标准(也就是 AES),这三个算法都是最后一批候选者,其中之一的 Rijndael 更是有幸成为 AES。
从那之后,世界上有非常多的密码专家对这些候选者(尤其是 Rijndael )进行了深入的研究。到目前为止,并没有发现明显的漏洞可以被利用。
退一百步讲,即使某个算法将来被发现有漏洞,只要你创建加密盘的时候,使用的是多重加密,问题就不大了。
目前 TrueCrypt 支持的多重加密有如下几种:
AES-Twofish
Serpent-AES
Twofish-Serpent
AES-Twofish-Serpent
Serpent-Twofish-AES
某些爱抬杠的读者会问,如果三个算法都被发现漏洞,咋办?俺觉得吧,这种概率非常非常非常小,完全不必为这种小概率的事情浪费心情。
★盗取内存中的密钥
(虽然前面说过了,俺还是要再啰嗦一句:密钥和密码是两回事)
从严格意义上讲,这种方式属于"盗取",而不是"破解"。之前好几个读者在留言中提到 TrueCrypt 的取证工具,号称能破解 TrueCrypt 加密盘。其实这些所谓的"破解",都仅仅是盗取。而且捏,要想成功盗取密钥,需要好几个前提条件。
◇概述
TrueCrypt 为了确保安全性,是不会把加密盘的密钥存储到硬盘上的。但是为了进行实时的加密解密,密钥必然会放在内存中。所以,攻击者如果能拿到整个操作系统的内存,并对内存进行分析,就有可能(不是"一定")找到密钥。
大伙儿请注意:
通过分析内存拿到密钥,有一个前提:必须是加密盘尚未卸载(umount)。当你把某个加密盘卸载(umount)的时候,TrueCrypt 就会把该加密盘在内存的密钥清空。换句话说,如果你所有的加密盘都已经正常卸载了,内存中就不含有 TrueCrypt 的密钥了。
但是"系统加密分区"是无法卸载的(上面跑着操作系统呢),所以,只要你加密了系统分区,就只能依靠正常关机来防止别人偷窥内存中的密钥。
那么,如何才能拿到操作系统的内存?攻击者可以来软的,也可以来硬的。来软的(软件方式)有3招:虚拟内存文件、休眠文件、内存转储文件;来硬的(硬件方式)有2招:冷启动攻击、DMA攻击。
下面俺逐一介绍这几种破解方式和防范措施。
除了这几种方式,其实也可以利用木马来盗取系统的内存。比如说,你的系统被植入一个很牛B的木马,理论上可以通过木马去 Dump 整个系统的内存。但是捏,既然攻击者已经植入了木马,就没必要去 Dump 内存来分析了——这么干太费劲啦,简直是舍近求远。有了木马,攻击者直接就可以利用木马来偷窥你的密码和 KeyFiles。所以,木马的情况俺放到后面的 "★盗取密码和 KeyFiles" 章节再来介绍。
◇虚拟内存文件
原理介绍
稍微熟悉 Windows 的同学,都知道 Windows 有一个虚拟内存文件。而且可以通过设置,把这个虚拟内存文件同时放到几个不同的分区上。
假如你存放虚拟内存的那几个分区没有加密,假如攻击者能够拿到你的硬盘,假如攻击者接触到硬盘的时候你的加密盘还没有卸载。当这3个"假如"同时成立,攻击者通过分析虚拟内存文件,有可能(不是"一定")拿到加密盘的密钥。
防范措施
1. 手动设置虚拟内存文件的存放位置,而不要让操作系统自动管理虚拟内存文件的存储位置。
2. 确保你存放虚拟内存文件的那些分区,都已经被加密了。
◇休眠文件
原理介绍
从 Windows 2000 开始,就提供了休眠功能。当操作系统休眠时,会把整个系统的内存写到系统分区根目录的某个文件。
假如你在打开加密盘的情况下休眠系统,假如你的系统分区没有加密,假如攻击者能够拿到你硬盘上的休眠文件。当这3个"假如"同时成立,那么攻击者通过分析休眠文件,有可能(不是"一定")拿到加密盘的主密钥。
防范措施
防范措施很简单,下面两招二选一:
1. 不要使用休眠功能,每次都正常关机
2. 加密系统分区
◇内存转储文件
原理介绍
在很早以前(大概是 Windows NT 3.1),Windows 系统就提供了内存转储功能。当操作系统崩溃的时候(比如系统蓝屏),内存转储功能会把崩溃这一瞬间的内存转储到硬盘上。当初提供这个功能,主要是为了便于微软的程序员排查系统崩溃的故障(早些年,Windows 蓝屏几乎是家常便饭)。
但是攻击者可以利用 Windows 的这一机制,人为触发一个系统崩溃,然后就可以拿到整个内存的转储文件。
假如你开启了"完全内存转储",假如在打开加密盘的情况下系统崩溃,假如你的系统分区没有加密,假如攻击者能够拿到你硬盘上的休眠文件。当这4个"假如"同时成立,那么攻击者通过分析转储文件,就能拿到加密盘的主密钥。
防范措施
Windows 的内存转储功能是可以手工禁用的。方法如下:
对于 Vista 之前的版本(Win2000、WinXP、Win2003)
以管理员身份登录到系统,在桌面上"我的电脑"点右键,快捷菜单上选"属性"。会弹出一个属性对话框,选"高级"标签页。下面有一个栏目是"启动和故障恢复",点"设置"按钮。会弹出第二个对话框,下面有个"写入调试信息"的下拉框。把这个下拉框选择成"不转储",然后点"确定"。
对于 Vista 之后的版本(Vista、Win7、Win8)
以管理员身份登录到系统,打开资源管理器,在"我的电脑"上点右键,快捷菜单上选"属性"。会弹出一个新窗口。在左侧栏选"高级系统设置",会弹出一个对话框。后面的操作就跟 WinXP 一样了。
◇冷启动攻击(cold boot attack)
这个攻击手法比较高级,能够实现这种攻击手法的人,需要配有专门的设备。假如俺没记错的话,此招数应该是2005年之后才开始在安全界流传。如果是5年前写此文,可能就不会写这一章节了。因为那时候六扇门的取证部门,很多还没有这个技术实力。但是最近几年,已经开始陆续具备这种技术实力了。
不过捏,也别太担心。如果你只是普通的网民,估计你还享受不到这种级别的攻击 :)
原理介绍
很多人都以为,断电之后,内存中就不会有数据了。其实不然!从断电到内存中的数据完全消失,存在一个数据滞留的时间差。而且这个时间差是依赖于温度的。如果把温度降到一定程度,这个时间差可以超过10分钟(至于多低的温度可以达到多长的时间差,跟具体的内存条规格有关,也跟主板型号有关)。
10分钟的时间差,已经足够让攻击者完成如下一系列动作:
1. 硬关机(拔电源)
2. 插上电源,重新启动
3. 进入 BIOS 设置界面,设为 U盘启动
4. 插入一个专门的 U盘
5. 利用 U盘上特制的软件,把整个内存保存到 U盘上
关于"冷启动攻击"的更多介绍,可以看洋文*(很详细哦),链接在"这里"。
防范措施
(只有对安全性要求很高的同学,才需要考虑"冷启动攻击")
要防范冷启动攻击,其实也不难。当你要长时间离开自己的电脑时,不要使用"待机"或者"锁定"(当然更不能使用"休眠"),要正常关机。正常关机的时候,TrueCrypt 会正常退出。在 TrueCrypt 正常退出之前,它会先清空储存密钥的内存位置。
补充说明:
正常关机主要是为了清除"系统加密分区"的密钥。
对于非系统加密分区或者逻辑加密盘,只要把某个加密盘卸载(umount),TrueCrypt 就会把该加密盘在内存的密钥清空。但是"系统加密分区"是无法卸载的(上面跑着操作系统呢),所以只能依靠正常关机。
◇DMA攻击(DMA attack)
原理介绍
这种攻击方式比冷启动攻击更新颖,应该是最近2-3年才出现的。
熟悉硬件的同学应该听说过 FireWire 硬件接口(俗称"火线接口",也叫 IEEE 1394 接口)。这玩意儿支持 DMA 方式直接操作物理内存。所以攻击者如果能物理接触你的电脑,可以在你的电脑上插入一个 FireWire 接口的设备,然后利用 DMA 的方式直接读取整个系统的内存。这种方式不仅仅是理论上可行,实际上已经有人搞了现成的 DMA 攻击工具——Inception
更多相关介绍,可以看洋文*,链接在"这里"。
防范措施
(只有对安全性要求很高的同学,才需要考虑"DMA 攻击")
前面提到的"冷启动攻击"的防范措施,也可以用来防范 DMA 攻击。另外,可以通过禁用 1394 接口的 DMA 模式防范这种攻击。根据微软官方文档(链接在"这里"),所有版本的 Windows 默认都是禁用 1394 接口的 DMA 模式。所以这种攻击的风险不算太大。
★盗取密码和 KeyFiles
◇通过木马盗取
原理介绍
如果你的系统被攻击者植入了木马,那么攻击者就可以利用木马来偷窥你的口令输入和 KeyFiles 输入。一旦拿到加密盘的口令和 KeyFiles,攻击者就可以轻松打开加密盘。
防范措施
从上面的介绍可以看出:确保本机的安全是至关重要的!
关于如何防范骇客植入木马,又是一个很大的话题——显然不可能在这里细聊。
◇通过替换 Boot Loader 盗取
原理介绍
对于系统盘加密或者全盘加密,TrueCrypt 会在硬盘的引导扇区(或主引导扇区)放一个定制的 Boot Loader。当你的系统启动时,会首先加载 TrueCrypt 的这个 Boot Loader,然后它会提示你输入密码。
如果攻击者可以物理接触到你的电脑,就有可能采用软件方式,用一个伪造的 Boot Loader 替换掉原来正宗的 Boot Loader。然后这个假的 Boot Loader 也会装模作样地提示你输入密码。再把你输入的密码转交给那个真的 Boot Loader,同时把密码保存在某个地方。
这样一来,攻击者就可以利用这个假的 Boot Loader,拿到你的密码。
防范措施1——BIOS 硬盘锁
对于笔记本电脑,如果 BIOS 支持的话,建议增加一个硬盘锁的口令。这样一来,即使攻击者拿到你的电脑,取出硬盘,也无法看到里面的内容。
提醒一下
不同品牌的笔记本,硬盘锁的机制是不同的。有的靠谱,有的不靠谱。一般规律是:越有实力的厂商,硬盘锁的安全性也越高。
其次要注意的是:如果你要防的是天朝的六扇门,最好不要用大陆品牌的笔记本。大陆品牌的笔记本,其硬盘锁可能会留有后门给*和国安使用。
防范措施2——使用 U盘 引导
这个招数比较适合于 Linux 之类的系统。你可以把整个系统安装到一个小小的 U盘上。然后把 U盘带在身边。每次开机就插入该 U盘来启动操作系统。
这种情况下,就不需要使用"加密系统分区"(因为系统分区已经在 U盘上了),自然也就不依赖硬盘的 Boot Loader。
◇其它盗取口令和 KeyFiles 的招数
上述介绍的,都是比较常见的,也比较容易实施的攻击手法。除了这几招之外,还有若干冷门的招数,也可以用来盗取密码或 KeyFiles。比如 基于硬件的"Key Logger"、比如 基于硬件的"边信道攻击"、等等。
这些招数比较罕见,而且需要有专门的硬件设备。如果你只是普通网民,那是没有资格享受到这种级别的攻击滴。通常只有商业间谍、军事间谍、政治间谍才会使用这类手段,用来对付重要人物。
而且考虑到篇幅已经比较长了,俺就不深入介绍这些冷门的手法了。
★总结
在 TrueCrypt 的产品手册中,作者已经明确指出:如果无法确保电脑的物理安全,那即使采用 TrueCrypt 也无法保证数据的保密性。在这种情况下泄密,不能算 TrueCrypt 的责任。
所以,确保物理安全是第一步。
其次,TrueCrypt 的手册还说了,如果你无法确保操作系统安全,那 TrueCrypt 也无法保护你的数据。比如前面提到的:植入木马可以偷窥你的口令。这种情况下是任何软件(包括杀毒软件)都无法彻底防范的。
所以,确保操作系统自身的安全是第二步。
天朝六扇门的人要想解开 TrueCrypt 加密盘,通常也是采用这两条路——要么从物理安全入手,要么从操作系统安全入手。到目前为止,没有任何公开的资料能够给出方法,用来快速突破TrueCrypt 本身的防线。暴力破解虽然可以突破 TrueCrypt 的防线,但非常非常非常"慢"。
目前那些号称能破解 TrueCrypt 的软件,基本上都是采用内存 Dump 的方式。这种方式的可用性比较差——如果拿不到"系统内存",这些破解软件完全没辙。
综上所述,只要你根据本系列介绍的经验,对 TrueCrypt 使用得当,TrueCrypt 加密盘的安全性是非常有保障的——至少对普通网民已经是足够了