本来第三篇想写隐藏卷相关的经验。但是看到好几个读者在留言中提及加密盘的破解,所以俺先来说说和破解有关的话题以及防范措施。
关于这个话题,在前一篇博文已经介绍了穷举的原理和防范的措施。所以,今天就不再啰嗦了。 这分两种情况:已知 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. 密码的作用是保护密钥(下面会提到)
加密盘的【密钥】是怎么来滴?
简单地说,“加密盘的密钥”是根据你输入的“口令和 Key Files”,通过某种复杂的数学运算产生出来(密码学术语叫“密钥生成函数”)。在“密钥生成函数”中,会用到“哈希运算”(也叫“散列运算”,洋文叫“hash”,这篇博文有 hash 的扫盲)和多次迭代。其效果就是——只要你输入的“password 或 KeyFiles”有一丁点的差异(哪怕仅仅“一个比特”的差异),产生的密钥也完全不同。正因为这样,当你输错密码时,肯定打不开加密盘。 顺便说一下,当你创建加密盘的时候,TrueCrypt 除了让你选择“加密算法”,还让你选择“哈希算法”(也叫“散列算法”)。为啥要选“哈希算法”捏?其中一个用途就是参与“密钥生成函数”的运算。 补充说明: 以上只是简述。如果要【细说】的话,TrueCrypt 的加密和解密过程还涉及“头部密钥”(Header Key)&“主密钥”(Master Key)这2个玩意儿。由于 TrueCrypt 采用的是 XTS 操作模式,所以头部密钥有一对,主密钥也有一对。如果选的是多重加密算法,主密钥就会有 N 对。 这些都属于技术细节,普通网友不需要知道太多,俺就省点口水,不深入聊了。
穷举密钥的【难度】
虽说穷举密钥的难度比穷举 KeyFiles 的难度要小很多。但穷举密钥的可能性,依然是天文数字。 目前 TrueCrypt 内置的三种加密算法,都使用 256 比特的密钥(256 比特 = 32字节)。对于 256 比特的密钥,其所有的可能性是2的256次方。这是一个天文数字,要进行这么多次的穷举(每一次穷举都有一定的运算量),就算拿未来10年发明的超级计算机来运算,估计也没戏。
(小知识)加密算法的“密钥长度”
前2个月(2013年)出了个新闻,说 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 为了确保安全性,当然【不】把加密盘的密钥存储到硬盘上的。但是为了进行实时的加密解密,密钥必然会放在【内存】中。所以,攻击者如果能拿到整个操作系统的内存,并对内存进行分析,就【有可能】(只是“可能”,不是“一定”)找到密钥。 大伙儿请注意: 通过分析内存拿到密钥,有一个前提——加密盘【尚未】卸载。当你把某个加密盘卸载(umount)的时候,TrueCrypt 就会把该加密盘在内存的密钥清空。换句话说,如果你所有的加密盘都已经正常卸载了,内存中就【不含】TrueCrypt 加密盘的密钥了。 但是,【系统加密分区】是无法卸载滴(上面跑着操作系统呢)。因此,只要你加密了系统分区,就只能依靠【正常关机】来防止别人偷窥该分区在内存中的密钥。 那么,如何才能拿到操作系统的内存?攻击者可以来软的,也可以来硬的—— 来软的(软件方式),常见的招数有:虚拟内存、系统休眠、内存转储; 来硬的(硬件方式),常见的招数有:冷启动攻击、DMA攻击。 下面俺逐一介绍这几种破解方式和防范措施。
除了这几种方式,其实也可以利用木马来盗取系统的内存。比如说,你的系统被植入一个很牛B的木马,理论上可以通过木马去 Dump 整个系统的内存。但是捏,既然攻击者已经植入了木马,就没必要去 Dump 内存来分析了——这么干太费劲啦,简直是舍近求远。有了木马,攻击者直接就可以利用木马来偷窥你的密码和 KeyFiles。所以,木马的情况俺放到后面的★【偷盗】密码和 Key Files章节再来介绍。
原理介绍 稍微熟悉 Windows 的同学,都知道 Windows 有一个虚拟内存文件。而且可以通过设置,把这个虚拟内存文件同时放到几个不同的分区上。
假如你存放虚拟内存的那几个分区【没】加密,假如攻击者能够拿到你的硬盘,假如攻击者接触到硬盘的时候你的加密盘还【没】卸载。当这3个“假如”【同时成立】,攻击者通过分析虚拟内存文件,【有可能】(只是“可能”,不是“一定”)拿到加密盘的密钥。
防范措施
1. 手动设置虚拟内存文件的存放位置,【不要】让操作系统自动设置“虚拟内存文件”的存储位置。 2. 确保你存放虚拟内存文件的那些分区,本身都已经加密了。
原理介绍 Linux 的“交换分区”,其性质类似于 Windows 的“虚拟内存文件”。因此,也要留意类似的风险。
防范措施
防范措施很简单,下面两招二选一: 1. 干脆不使用“交换分区”(安装系统时就不创建这个分区);
2. 使用 Linux 自带的 dm-crypt(LUKS)加密“交换分区”。具体教程参见《扫盲 dm-crypt》。
原理介绍 从 Windows 2000 开始,就提供了休眠功能。当操作系统休眠时,会把整个系统的内存写到【系统分区】根目录下的某个文件。
假如你在打开加密盘的情况下休眠系统,假如你的“系统分区”【没】加密,假如攻击者能够拿到你硬盘上的休眠文件。当这3个“假如”【同时成立】,那么攻击者通过分析休眠文件,基本上可以拿到加密盘的主密钥。
防范措施
防范措施很简单,下面两招二选一: 1. 不要使用休眠功能,每次都正常关机 2. 加密系统分区
原理介绍 在很早以前(大概是 Windows NT 3.1),Windows 系统就提供了内存转储功能。当操作系统崩溃的时候(比如系统蓝屏),内存转储功能会把崩溃这一瞬间的内存转储到硬盘上。当初提供这个功能,主要是为了便于微软的程序员排查系统崩溃的故障(早些年,Windows 蓝屏几乎是家常便饭)。 但是攻击者可以利用 Windows 的这一机制,人为触发一个系统崩溃,然后就可以拿到整个内存的转储文件。
假如你开启了“完全内存转储”这个系统选项,假如在打开加密盘的情况下系统崩溃(蓝屏),假如你的“系统分区”【没】加密,假如攻击者能够拿到你硬盘上的转储文件。当上述4个“假如”【同时成立】,那么攻击者通过分析转储文件,基本上可以拿到加密盘的主密钥。
防范措施
Windows 的内存转储功能是可以【手工禁用】滴。具体方法如下: 对于 Vista【之前】的版本(Win2000、WinXP、Win2003) 以管理员身份登录到系统,在桌面上“我的电脑”点右键,快捷菜单上选“属性”。会弹出一个属性对话框,选“高级”标签页。下面有一个栏目是“启动和故障恢复”,点“设置”按钮。会弹出第二个对话框,下面有个“写入调试信息”的下拉框。把这个下拉框选择成“不转储”,然后点“确定”。 对于 Vista【之后】的版本(Vista、Win7、Win8 …) 以管理员身份登录到系统,打开资源管理器,在“我的电脑”上点右键,快捷菜单上选“属性”。会弹出一个新窗口。在左侧栏选“高级系统设置”,会弹出一个对话框。后面的操作就跟 WinXP 一样了。 这个攻击手法比较高级,能够实现这种攻击手法的人,需要配有专门的设备。假如俺没记错的话,此招数应该是2005年之后才开始在安全界流传。如果是5年前写此文,可能就不会写这一章节了。因为那时候六扇门的取证部门,很多还没有这个技术实力。但是最近几年,已经开始陆续具备这种技术实力了。 不过捏,也别太担心。如果你只是普通的网民,估计你还享受不到这种级别的攻击 :)
原理介绍
很多人都【误以为】:电脑断电之后,内存中就不会有数据了。其实不然!从“断电”到“内存中的数据完全消失”,存在一个数据滞留的时间差。而且这个时间差是依赖于温度的。当温度降到一定的程度,这个时间差可以超过10分钟(至于多低的温度可以达到多长的时间差,跟具体的内存条规格有关,也跟主板型号有关)。 10分钟的时间差,已经足够让攻击者完成如下一系列动作:
1. 硬关机(拔电源) 2. 插上电源,重新启动 3. 进入 BIOS 设置界面,设为“U 盘启动” 4. 插入一个专门的 U 盘 5. 利用 U 盘上特制的迷你系统重启
6. 重启后把全部物理内存的数据复制到 U 盘上
上述做法涉及到“重启系统”,会稍微破坏物理内存的原始内容。更专业的攻击者(比如警方的【技侦人员】)还可以用更牛逼的方式——对电脑降温之后,直接拔出内存条,然后通过专用设备取出“原汁原味的”内存数据。
关于“冷启动攻击”的更多介绍,可以看洋文维基百科(很详细哦),链接在“这里”。
防范措施
(只有对安全性要求很高的同学,才需要考虑“冷启动攻击”) 要防范冷启动攻击,其实也不难。当你要长时间离开自己的电脑时,不要使用“待机”或者“锁定”(当然更不能使用“休眠”),要【正常关机】。这种情况下,TrueCrypt 会正常退出。在 TrueCrypt 正常退出之前,它会先清空储存密钥的内存位置。
补充说明
刚才强调“正常关机”,主要是为了清除“【系统】加密分区”的密钥。 对于【非系统】加密分区或者逻辑加密盘,你只需把某个加密盘卸载(umount),TrueCrypt 就会把该加密盘位于内存的密钥擦除。但是,“系统加密分区”是无法卸载的(上面跑着操作系统呢),因此只能依靠正常关机。
原理介绍 这种攻击方式比冷启动攻击更新颖,应该是最近2-3年才出现的。
熟悉硬件的同学应该听说过 FireWire 硬件接口(俗称“火线接口”,也叫“IEEE 1394 接口”)。这玩意儿支持 DMA 方式直接操作物理内存。所以攻击者如果能物理接触你的电脑,可以在你的电脑上插入一个 FireWire 接口的设备,然后利用 DMA 的方式直接读取整个系统的内存。这种方式不仅仅是理论上可行,实际上已经有人搞了现成的 DMA 攻击工具——Inception
更多相关介绍,可以看洋文维基百科,链接在“这里”。
防范措施
(只有对安全性要求【很高】的同学,才需要考虑“DMA 攻击”)
前面提到的“冷启动攻击”的防范措施,也可以用来防范 DMA 攻击。另外,可以通过禁用 1394 接口的 DMA 模式防范这种攻击。根据微软官方文档(链接在“这里”),所有版本的 Windows 默认都是禁用 1394 接口的 DMA 模式。所以这种攻击的风险不算太大。
原理介绍 如果你的系统被攻击者植入了木马,那么攻击者就可以利用木马来偷窥你的口令输入和 KeyFiles 输入。一旦拿到加密盘的口令和 KeyFiles,攻击者就可以轻松打开加密盘。
防范措施
从上面的介绍可以看出:确保本机的安全是至关重要的!
关于如何防范骇客植入木马,又是一个很大的话题——显然不可能在这里细聊。列位看官如果有兴趣,请看本博客的另一个系列《如何防止黑客入侵》。
原理介绍 对于系统盘加密或者全盘加密,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 盘上了),自然也就不依赖硬盘的 Boot Loader。 上述介绍的,都是比较常见的,也比较容易实施的攻击手法。除了这几招之外,还有若干冷门的招数,也可以用来盗取密码或 KeyFiles。比如:基于硬件的“Key Logger”、基于硬件的“边信道攻击”、等等。 这些招数比较罕见,而且需要借助专门的硬件设备。如果你只是普通网民,通常【没】资格享受到这种级别的攻击 :) 一般来说,只有“商业间谍、军事间谍、政治间谍”才会使用这类手段,以对付重要人物(高价值目标)。 而且,考虑到篇幅已经比较长,俺就不深入介绍这些冷门的手法了。 在本文的末尾,稍微总结一下。 在 TrueCrypt 的产品手册中,作者已经明确指出:如果无法确保电脑的【物理安全】,那即使采用 TrueCrypt 也无法保证数据的保密性。在这种情况下泄密,不能算 TrueCrypt 的责任。 所以,确保【物理安全】是第一步。 其次,TrueCrypt 的手册还说了,如果你无法确保【操作系统安全】,那 TrueCrypt 也无法保护你的数据。比如前面提到的:植入木马可以偷窥你的口令。这种情况是任何软件(包括杀毒软件)都无法【彻底防范】滴! 所以,确保【操作系统自身安全】是第二步。 天朝六扇门的人要想解开 TrueCrypt 加密盘,基本上就是采用这两条路——要么从物理安全入手,要么从操作系统安全入手。(除了这两个途径)【没有】其它任何途径可以用来【快速】突破 TrueCrypt 本身的防线。 目前那些号称能破解 TrueCrypt 的软件,基本上都是采用“内存 Dump 的方式”。这种方式的可用性比较差——如果拿不到“系统内存”,这些破解软件完全没辙。 当你做好了上述两种防范,基本上就排除了“【快速】破解”的可能性。接下来要考虑的是“【慢速】破解”——也就是各种“暴力破解”。 暴力破解从【理论上】讲,虽然可以突破 TrueCrypt 的防线,但可能会很慢。具体有多慢,取决于你使用的密码有多么复杂,也取决于你是否组合了 KeyFiles。只要你设置了足够复杂的密码,并组合了 KeyFiles,“暴力破解”可能需要花几百年以上(即使把“硬件升级”的因素考虑进去)。那这种风险就可以忽略不计啦。 综上所述,只要你根据本系列介绍的经验,对 TrueCrypt 使用得当,TrueCrypt 加密盘的安全性是非常有保障的——至少对普通网民已经是足够了。
俺博客上,和本文相关的帖子(需翻墙):
《TrueCrypt——文件加密的法宝》
《扫盲 VeraCrypt——跨平台的 TrueCrypt 替代品》
《如何用“磁盘加密”对抗警方的【取证软件】和【刑讯逼供】,兼谈数据删除技巧》
《文件加密的扫盲介绍》
《扫盲文件完整性校验——关于散列值和数字签名》
《扫盲 dm-crypt——多功能 Linux 磁盘加密工具(兼容 TrueCrypt 和 VeraCrypt)》