突然发现1password要涨价了,先回看下密码使用中的安全隐患吧
大部分人都不太了解我们使用密码过程中的安全隐患

这两个月不是买了好几家的 Coding Plan 吗,怕自动续费没取消到日子又扣钱,就抽空仔细检查了各个平台上的自动订阅。然后无意中发现我用了6年多的 1password 下个月要涨价了,涨了35%还多。
所以就想再重新调研下密码管理软件,盘一盘有没有比 1password 更适合我的。不过在此之前,我们还是先说说在密码的使用和管理上,都有哪些安全隐患吧。
不要只用几个密码
你还记得自己在互联网上第一次注册账号密码的是哪个网站吗?我应该是初中毕业那年注册的eyou的邮箱,然后应该是新浪或是网易的邮箱,再然后是QQ,再然后就是一堆一堆了。到今天至少也在数百个网站上注册过账号了。
我看了下 1password,过去六年我一共创建了314个账号密码,几乎是每周都会添加一组新的账号密码。当然,我这个职业决定了我注册的网站肯定比大部分人多,但就算你只有几十个账号密码,使用和管理也是需要耗费一些心力的,而且很难避免安全隐患。
举个最简单的例子,你虽然注册过几十个网站,但你使用过的密码肯定没那么多,因为你记不住。大部分人可能只用过两三个密码,这本身就是巨大的安全隐患。因为只要你注册过的网站中有一个泄漏了你的账号密码,那就相当于你大部分,甚至全部的账号密码被泄漏了。
可能有人会用基础密码+网站名称的方式来为每个网站设置不同的密码,稍微好些,但这种套路不是什么秘密。当你其中一个密码泄漏了,也很容易推理出你的基础密码和拼接规则是什么,还是不安全。
著名泄漏事件
2011年12月21日,有一个网站的用户数据库文件在网络上流传开来,文件中包含了600多万个用户的账号密码,而且是密码明文。明文的意思就是说,如果你的密码是123456,那数据库里保存的就是123456,没有经过任何处理。
之所以强调明文,是因为稍微有点儿开发经验的人都知道,使用数据库保存用户密码时,不能保存明文。我做过的项目中,保存的大都是经过哈希计算的结果,这样就算数据库泄漏,用户的密码也不会被泄漏。
但显然,这个网站的开发者并没有这样的基本素养。但极其讽刺的是,这个泄漏了数据库的网站叫 CSDN,是当时国内最大的程序员社区。

这种密码泄漏的可怕之处,不是有谁知道了你 CSDN 的密码,而是他们借此知道了你常用的密码。原因就是我前面说的,大部分人注册数十个网站,但使用的就那么一两个密码。所以当不法分子拿到了你 CSDN 的账号密码后,他就可以用它们登录你当当网的账号,然后盗走你的礼品卡余额。

在后续报道中,我们还可以看到,尽管 CSDN 密码泄漏的事情已经闹得沸沸扬扬,但修改密码的用户只有30%。相信我,在另外70%的人群中,知道密码被泄漏了的,且仍旧使用 CSDN 的大有人在。
薄弱的安全意识
我当年在这方面也不是特别敏感,也没有第一时间修改密码,而是过了一天琢磨过味儿来了,才赶紧改了一批网站的密码。那个年代,大家的虚拟资产还不太多,要是再过个几年,移动支付流行起来了,再来这么一下,那你看吧,余额被盗的案件将会非常多。
因为大部分人在这方面的安全意识都非常薄弱,很多人根本没意识到自己的密码已经被泄漏了,所以那个泄漏的数据库文件,够犯罪分子们用好几年的了。
不要觉得一个网站泄漏用户密码是个稀罕的事情,不同网站的技术水平差异很大,CSDN 这样的程序员社区都能明文存密码,其他网站的安全就更没保障了。
这里有个误区,很多人看一个网站内容做得很好,就会同时信任这个网站本身。但一个网站的内容,和这个网站本身并无必然关系。网站的内容再好,再值得信任,也不代表开发这个网站的程序员具备合格的水平,因为做内容的人往往不懂技术,甚至没有精力为技术负责。
安全隐患还有一堆
如果上面讲的这个例子对你来说蕴含着很多新知识,大大提高了你的安全意识,那你可得小心了,因为这已经是最最基本的安全常识了。
下面我们看看一个普通的网站登录动作,都会涉及到哪些安全隐患。我尽量说一些不需要太多技术基础也能听懂的,但这也已经够多了。
服务端明文保存
我们打开一个登录页面,填上用账号和密码,然后点击登录。浏览器就会把你的账号密码发送到服务端。服务端会根据收到的账号,去数据库查到你的密码,然后跟你传过来的密码进行比对,如果一样,就允许你登录网站了。

这就是以前登录 CSDN 的一个基本流程。我们已经知道了,这样直接存储用户密码的方法是有巨大的安全隐患的,一旦数据库泄漏,用户密码也就直接泄漏了。
所以不能在数据库存储明文密码,而是应该对密码进行加盐的哈希计算,把计算后的哈希值存储在数据库。因为服务端保存密码的目的是为了登录时对比密码,所以每次都进行同样的哈希计算也能达到这个目的。这样就能在服务端数据泄漏时,最大程度的保障用户密码的安全了。
传输过程泄漏
我之前在讲 REST 的文章中提到过,我们上网使用的 HTTP 协议是一种分层架构。你一个登录操作的请求,是经过很多中间层后才到达服务端的,所以你提交的密码在这些中间层也有泄漏的风险。
要避免这种情况,就要对传输的内容进行加密,不让中间层知道你传输的是什么,HTTPS 就能实现这样的效果。如今的主流浏览器都会对使用 HTTP 访问的网站给出一个非常明显的安全警告,迫使各大网站都尽可能使用 HTTPS 协议,最大程度上避免了密码在中间层泄漏。

还有 DNS 劫持,我去年写过一篇文章介绍 DNS 的工作流程,DNS 劫持就是在整个解析链路中的任何一环,给你返回一个错误的解析地址,使你本该发给正规网站的账号密码信息,发给了攻击者的服务器。虽然 HTTPS 能起到一定的防护作用,但如果你操作不当,密码还是会泄漏。
还有钓鱼网站,给你发一个与正规网站相似的地址,内容也做得一模一样,然后你登录时,就相当于乖乖把账号密码发给了人家。所以不要随便点击不明来源的链接。当然,如果你能看懂 URL 地址,看懂域名是什么,那就更好了。
有些网站还会提供一层保险措施,就是不直接发送明文密码,而是在浏览器中对密码加密,只传输加密后的密码。这样就算传输层出现问题,也不会泄漏密码本身。因为 HTTPS 本身就已经对传输内容加密了,所以这种只传输加密的密码,更多是为了证明服务端无法拿到原始密码。
不过,如果攻击者从中间层盗取了你加密的密码,也可据此来仿冒你的请求,从而获得你的登录权限。所以这层加密也会有一些技巧,来避免所谓的重放攻击。也就是通过某种机制,让你的请求只能被处理一次,如果攻击者发出相同数据的请求,可以直接拒绝处理。
客户端也不安全
就算服务端和传输过程有了保障,但你在输入密码的时候也还是有很多安全隐患。例如 XSS 攻击,通过诱导你点击一些恶意链接,或者直接在网站上注入恶意脚本,都可以让网页直接盗取你输入的密码。
当然,攻击者还可以直接攻击你的电脑,那你的所有操作对攻击者来说都可能一览无遗。或者稍微隐蔽一些,可以通过恶意软件读取到你复制到剪贴板中的密码,这对于把密码记在记事本里,或是使用密码管理工具的人来说也是绝杀。所以电脑的安全防护也不能忽视。
做好防范
以上这些不懂技术的应该也能看懂吧,还有一些技术含量更高的,我不专门研究这方面,可能连我都说不太清楚。但请你不要怀疑,如果有专业人士想专门针对某个人进行攻击,绝大多数人是很难抵抗的。
不过只要你不是什么特殊人物,是不会有人专门针对你进行攻击的。我们普通人所能遭遇的攻击,主要还都是广撒网型的,利用的都是上面那些比较常见的安全漏洞。捞到一些防范意识低的,就够那些攻击者赚的了。
所以对于绝大多数人来说,想保障自己账号和密码的安全,防范住上面那些常见的安全隐患就好,我觉得你至少要做好以下几点:
- 不要安装来历不明的软件(防止电脑被攻击)
- 不要在陌生设备上登录账号(防止使用有恶意程序的电脑)
- 不要随意点击来历不明的链接(防止钓鱼网站和恶意代码注入)
- 访问网站时不要光看模样,也要确认域名(防止钓鱼网站)
- 不要拿浏览器的安全警告不当回事(注意使用 HTTPS 协议)
- 不要在不同的网站使用相同的密码(防止网站泄漏你的密码威胁到其他网站账号)
- 不要使用容易破解的简单密码(防止暴力破解)
- 不要把密码存储在不安全的地方,尤其不要明文存储(防止密码文件泄漏)
嗯,好像要都做到也不是很容易。这还只是泛泛而谈的,如果再具体一些还能有很多建议。比如,及时升级常用软件,避免安全漏洞;开启账号的双重验证;发现密码泄漏及时更换等等。
涉及到密码本身的,例如给每个网站设定不同的密码,提高密码的复杂度,密码的保存,及时关注密码的泄漏。这些都能依靠密码管理软件来解决。
我六年前就是为了解决这些问题,而调研了一些密码管理软件,然后选择了 1password。用了这么多年体验很不错,不过它要涨价了,所以借此机会想盘一盘当下主流的密码管理软件,看看是否能找到更实惠的。结果还是有些收获的,我先用两天,下一篇咱再具体说说。