密码如何对抗大记忆恢复术

书接「上文

众所周知,密码可以做到防止被暴力破解,但是脑子不能。对此,最简单粗暴又有效的方法当然是「从一开始就没记住」,这种方法在文件加密和硬盘加密上的应用早就不是什么新鲜事了:

TrueCrypt——文件加密的法宝 @ 编程随想的博客
扫盲 VeraCrypt——跨平台的 TrueCrypt 替代品 @ 编程随想的博客

接下来是重量级文章,教你如何通过微波炉烤U盘等方法销毁你本来就没记住的密钥:

如何用“磁盘加密”对抗警方的【取证软件】和【刑讯逼供】,兼谈数据删除技巧 @ 编程随想的博客

以上三篇(需要翻墙)便是我接下来要介绍的经验的「前置条件」。前面两篇相当于Veracrypt教程,就版本来说年代稍微有些久远,只不过因为第三篇是编程随想写的我就顺便把前传贴上来了,建议自己去别处找个Veracrypt的使用教程,或者直接去看官网

总之,防止大记忆恢复术的关键在于「使用自己根本记不住的单个或多个密钥文件进行加密,在遭到逮捕时迅速将密钥文件销毁」。但问题在于,「编程随想」这套办法只能用在文件或硬盘的加密上,并不能用来让你忘掉你的帐号密码。因此,要解决这个问题,就要将拥有自动填充功能的密码管理器所在虚拟机操作系统的虚拟硬盘文件使用Veracrypt加密。你可能会问,既然Veracrypt可以加密整个系统,为啥还得虚拟机呢?很遗憾,因为加密操作系统并不支持使用密钥文件。当你注册账号的时候,就应当选择使用放在Veracrypt加密卷里面的虚拟机,用各种方法构造一个你没记住(根本记不住)的密码,然后储存在密码管理器内,登录账号时再使用自动填充,这样一来,只要在遭到刑讯逼供之前,让能解锁这个虚拟机的东西从这个世界上彻底消失,就避免了你被迫回忆其任何东西的可能。

生成根本记不住的密码的方法

前头提到那个书接上文的上文,介绍过通过对「种子」求散列运算构造密码的方法,很遗憾,因为你还记得种子是什么,所以专政机关会帮你想起来。因此,所谓根本记不住的密码,必须得是自动生成的字符串。

pwgen

对于GNU/Linux系统,最好使用pwgen来生成密码,你应当使用包管理器来安装它。

语法:

1
pwgen [ OPTION ] [ pw_length ] [ num_pw ]

参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
-c or –capitalize
密码中至少包含一个大写字母

-A or –no-capitalize
密码中不包含大写字母

-n or –numerals
密码中至少包含一个数字

-0 or –no-numerals
密码中不包含数字

-y or –symbols
密码中至少包含一个特殊符号

-s or –secure
生成完全随机密码

-B or –ambiguous
密码中不包含歧义字符(例如1,l,O,0)

-H or –sha1=path/to/file[#seed]
使用SHA1 hash给定的文件作为一个随机种子

-C
在列中打印生成的密码

-1
不要在列中打印生成的密码,即一行一个密码

-v or –no-vowels
不要使用任何元音

例子:生成20个带大写、带符号、带数字、完全随机的14位密码

1
2
3
4
5
$ pwgen -cnys 14 20
mQ3E=vfGfZ,5[B #zmj{i5|ZS){jg Ht_8i7OqJ%N`~2 443fa5iJ\W-L?] ?Qs$o=vz2vgQBR
^'Ry0Az|J9p2+0 t2oA/n7U_'|QRx EsX*%_(4./QCRJ ACr-,8yF9&eM[* !Xz1C'bw?tv50o
8hfv-fK(VxwQGS q!qj?sD7Xmkb7^ N#Zp\_Y2kr%!)~ 4*pwYs{bq]Hh&Y |4u=-Q1!jS~8=;
]{$N#FPX1L2B{h I|01fcK.z?QTz" l~]JD_,W%5bp.E +i2=D3;BQ}p+$I n.a3,.D3VQ3~&i

(注意:$是命令提示符,不包含在内,第一行以后是输出结果)

OpenSSL

pwgen只能在Linux上使用,而OpenSSL什么都支持,对应系统的安装方法请自己搜。OpenSSL主要通过调用各种密码学函数来生成密码,在此举一个常见用法:随即生成一个14位的base64字符串

1
2
$ openssl rand -base64 14
WjzyDqdkWf3e53tJw/c=

GnuPG

GnuPGOpenSSL同理:生成一个14位高强度密码

1
2
$ gpg --gen-random --armor 1 14
jq1mtY4gBa6gIuJrggM=

浏览器

以上几种都是常见的加密工具、密码工具用来生成随机密码的方法,但要说最方便,还得是生成、储存、自动填充一起的浏览器,而说到浏览器要保障安全性,则首当其冲要选择Firefox(注意不要下载中国特供版)。

账号使用环境不安全?

如果你成功让自己一开始就没记住密码,那么获得你所要登录的账号的密码的唯一途径便是在你使用帐号时进行攻击。

所谓攻击大概有两种,一种是入侵你的系统,另一种则是站在你背后看着。对于后者我没什么可说的,不过倒是确实有那种FBI提前进你家装摄像头的剧本,这个归你自己管了,我帮不上忙。对于可能存在的操作系统被入侵的可能性怎么办呢?除了老生常谈的常规方法(决不是指安装杀毒软件,而是指安全的使用习惯),还有一点值得注意,咱们使用的——是虚拟机。

对方要通过木马窃取你的密码,而且是窃取自动填充的密码,意味着木马必须在你进行「本次」登录操作前存在,这个木马是怎么来的呢?无非就是因为你下载了什么东西,别无第二种可能。因此,在保持「纯净」的状态下配置好自动填充服务,然后使用虚拟化软件建立这个纯净状态下的快照,并设置每次开关都恢复到这个快照,这样一来,木马在登录操作进行前存在就根本不可能。不过,恢复快照意味着虚拟硬盘的改动丢失,如果你要存什么文件,可以考虑搞另一块虚拟硬盘然后设置为「永久」,这样它就不受快照影响了(换句话说,此乃漏洞!)。

既然存在这种离谱漏洞,在要求更加安全的情况下肯定是不能接受的。为此提出的解决办法是:这个纯净环境就一直让他纯净,不要使用,只用作输密码的「登录」。登录时选择记住登录状态,就会在浏览器里保存一个cookie,这样一来,网站只要看到这个cookie,就知道你的登录状态,而通过这个cookie并不能推算出密码。这时你再创建一个可以随便搅和的「使用环境」虚拟机,要登录的时候直接把这个cookie导入过来,就算有木马,他也看不见你的密码。(注意:cookie有时效)