开源密码管理器更安全吗?(2)

- 密码管理器怎样保护我们的密码?

加密原理

密码学历史悠久,常用于古代军事通信。

3000年前姜子牙就发明了阴符,2000年前罗马帝国诞生了广泛使用的凯撒密码。这些都称为古典密码,通常使用替换法或者移位法。古典密码非常容易破解,只要得到密文,即使不知道加密方法,也能通过频率分析,暴力破解,得到原文。

caesar cipher

20世纪后期,现代密码学诞生,很快成为了计算机时代数据安全的基石。对于需要加密的数据(明文 plaintext),使用一个随机密钥(key),进行一系列复杂的计算(加密算法),得到加密后的数据(密文 ciphertext)。只需要保证密钥key不泄漏,即使知道加密算法,也无法从密文得到明文。

密码管理器存储和管理我们所有的密码,安全至关重要,那到底是怎样保护着我们的密码呢?

密码管理器一般要求用户设置一个主密码,并严格保密。在 密码管理器进化史(2/4) 一文中,我们详细讲解了第二代密码管理器使用现代密码学算法加密数据的方法。常见密码管理器加密的关键步骤如下:

graph LR MasterPassword([master password]) --> PBKDF2(PBKDF2) --> key --> Cipher(AES) plaintext([account data]) --> Cipher --> ciphtertext[[ciphtertext]]

采用 PBKDF2 或其他密钥生成算法,数据安全就从要求key保密,转换成了要求主密码保密。打个比方,我们的密码就像放进一个保险箱(加密数据库)中,主密码就是这个保险箱的钥匙。

保险箱

常见加密错误

目前市面上的密码管理器产品繁多,然而很多厂商,甚至包括一些知名的,历史悠久的密码管理器厂商,不具备足够的安全技术技能,不会正确的使用密码学算法,也不懂安全设计。TeamSik团队在2016年分析了市面上很多密码管理器,发现常见的错误有:

password managers vulnerabilities

上图是TeamSik发现的一些密码管理器的漏洞,第一行Master/PIN关于存储主密码和自研加密算法,第二行关于固定加密密钥(其他漏洞不属于加密错误)。

主密码加密密钥一旦泄露,将威胁到保存的所有密码,密码管理器任何时候都绝不应该“私下配一把钥匙”。作为用户,挑选密码管理器产品时,需要详细了解产品的安全技术,而非一味依赖所谓的“名牌”效应。

开源密码管理器提高了透明度,给有能力的用户机会审查开发者是否正确使用了加密算法。我们公开详细讲解密码管理器的加密算法,希望帮助用户增加对“神秘”的加密算法的了解,也能和更多密码管理器开发者一起讨论并提升安全设计水平。

解锁因素

我们从密码管理器加密的原理可以知道,常见的第二代密码管理器解锁时,需要主密码加密数据库,缺一不可,我们称之为解锁因素

很多密码管理器告诉用户:只要保护好主密码就不会泄密。由于现实中仍然存在很多主密码泄露的风险:

显而易见,同时保护主密码加密数据库更加安全,暴露任何一个因素,都会增加泄密风险。用户和密码管理器都应该尽力保护这两个解锁因素。

增加更多解锁因素,可以提升密码管理器的安全性。

密码管理器大多使用双因素解锁(主密码+加密数据库),KeepPass引入解锁文件(key file)把解锁因素提高到3个,有利于提升安全性。

密码管理器的加密算法中,我们详细讲解了密码管理器的加密设计如何通过增加解锁因素来提升安全性。

有些基于云的密码管理器厂商提供了双因素登录验证(2 factors authentication),第2个登录验证并不能用于加密数据,并非这里所说的解锁因素。

威胁模型和攻击面

解锁因素越多越安全,但是很多密码管理器一味强调只要保护好主密码,不重视其他解锁因素(如加密数据库)的保护,仍然会增加泄密风险。让我们从威胁模型和攻击面的角度来分析。

威胁模型是指软件可能面对的威胁或风险。威胁对不同人是不一样的,有些人可能很担心女友翻看自己的手机,也有人会和家人共享电脑和电脑上保存的密码。用户需要根据自己的需求选择密码管理器产品。

攻击面是软件提供功能时,可能被黑客用来攻击软件的地方,黑客可能非法给软件输入恶意数据,或者从软件中获得敏感数据。软件安全的基本原则就是攻击面要尽可能小,越小越好。

我们知道,解锁因素是密码管理器的关键。不同场景下,密码管理器对这些因素的保护差别很大。

社交圈

很多电脑版,浏览器插件版、网页版密码管理器都会长期保持解锁状态,社交圈子的人(家人、朋友、同事等)有可能查看你的电脑上保存的密码。

手机版密码管理器相对好一些,手机都会自动锁定,手机上使用生物验证也比输入密码容易。

Image by Peggy und Marco Lachmann-Anke from Pixabay

威胁模型评估:

恶意软件入侵

电脑上,加密数据库存储在硬盘上。这也会暴露一个攻击面,大多数软件,包括恶意软件,都可以随意读取。恶意软件还可能劫持键盘输入偷取主密码,有些电脑版密码管理器采用一些复杂技术增强主密码输入的保护,提高偷取难度。但是大多数浏览器插件版密码管理器,受浏览器平台的技术限制,没有能力防范恶意软件,是最不安全的。

相对而言,手机版密码管理器要安全得多。手机操作系统提供了沙盒保护,即使是恶意App也不能随意访问另一个App的内部数据。密码管理器把加密数据库存储在App内部,就可以防范绝大多数恶意软件偷取。不过Android操作系统还允许App把数据保存在公共存储区,如果密码管理器这样做,也会暴露这个攻击面,被恶意软件窃取。另外如果使用了恶意输入法App输入了主密码(很多Android输入法同时也可以读取公共存储),也可能泄漏主密码

没有沙盒保护和有沙盒保护

威胁模型评估:

电脑和手机操作系统都存在安全漏洞可以被利用,有的安全漏洞甚至允许恶意软件获得系统最高权限,从而绕过沙盒保护,偷取其他App的内部存储数据。密码管理器对此无能为力,需要我们及时安装系统安全补丁,减少泄密机会。

设备丢失

如果电脑或手机被黑客拿到,需要先解锁登录设备,然后打开密码管理器软件并输入主密码,才能看到保存的数据。但是有些Android手机系统,可以在没有解锁的情况下,直接通过数据线读取公共存储区的数据。如果密码管理器把加密数据库保存到公共区域,会增加泄密风险。

威胁模型评估:

同时我们也应该设置复杂的设备解锁密码和主密码,降低风险。

网络

基于云的密码管理器必须联网,甚至有些离线密码管理器(比如enpass)也会联网。如果使用网络,厂商的工作人员就可以查看所有发送到云端的数据,云端也可以向App发送数据和控制指令,用户需要考虑更多威胁:

作为用户几乎无法了解App和互联网之间到底传输了哪些数据,无法评估风险。

网络这种不透明的输入输出方式暴露了一个巨大的攻击面,就像潘多拉盒子,打开了无限可能。

云端

基于云的密码管理器会将用户的加密数据库传输到云端,就像一个蜜罐,吸引着无数黑客。对于有权限访问云端数据的内部员工,也很难保证他们绝无私心。

知名多因素验证器Authy被黑 进而导致密码管理器LastPast被黑
知名多因素验证器Authy被黑 进而导致密码管理器LastPast被黑

事实上,密码管理器和其他安全厂商的云端并没有多少不同,都同样存在被入侵的风险。一旦加密数据库暴露,就只剩下主密码这一个因素了。

总结

密码管理器通常宣传的“军事级”加密算法(AES加密算法),只是安全的基石,大多数密码管理器都会采用。

有一些密码管理器开发者,甚至包括一些知名的安全厂商(技术积累主要在杀毒,防火墙和VPN等领域),并不具备加密算法和密码管理等方面的专业技术,不能很好的保护数据安全,甚至犯下保存主密码这样显而易见的错误。

但并非使用了“军事级别”加密算法就能确保数据绝对安全,产品本身的安全设计更加重要。除加密算法外,密码管理器安全主要取决于:

简单来说,解锁因素越多越好,并且每个解锁因素都需要尽可能保护好。

可惜密码管理器无法在满足用户各种需求的同时,又能完美应对所有威胁模型,不暴露任何解锁因素,不存在攻击面。

不可能三角

不使用密码管理器最不安全,使用密码管理器也无法消除所有威胁。在选择产品时,我们需要考虑自己最关心的威胁模型,确保面对这些威胁,密码管理器只留下最小的攻击面,暴露最少的解锁因素。

开源密码管理器提供了一定的透明性,但更重要的还是详细了解它的安全设计,能否把我们最关心的风险降到最低。


上一篇:开源密码管理器更安全吗?(1) - 隐秘的角落