一段真实的故事

从信用卡被盗刷开始讲起

那是一个风和日丽的工作日,火热搬砖中的的咱突然接到短信说咱的信用卡消费了 $50。

信用卡扣款通知

在反应过来信用卡被盗刷后,第一时间申请冻结了信用卡,并解除了所有账号上绑定的信用卡。

经过一番查询、电话后,搞明白了扣款方是 Google Ads。咱啥时候都开始通过广告推广起自家的品牌了?事出反常必有妖,梦做完后,咱开始反思平常都做了什么不该做的。

百思不得其解的咱,继续搬起了砖。

账号大规模失窃现场

后来的几天,邮箱里开始陆续收到来自各个网站的安全通知。Amazon、Microsoft、任天堂、BTC、Vultr、Twitter,好在咱比较穷,这些账号里没有半毛钱。

各网站的邮件截图

咱的 Github 账号也被异地登录,还被建了一大堆莫名奇妙的仓库,收获了一大堆 star 。。。

连夜改密码

好在邮箱有二次校验,并未失窃,能够追回全部账号。

吃过一回亏,不再想用任何密码管理器,也不相信任何一个网站、APP 能守护好咱的密码,便利总是有代价的,最安全的地方只有咱的脑子。

但无奈不同网站接受的密码规则不一样,更不可能都用同样的密码。咱记性又不好,还是决定把密码记在一个文件里,但要是这都被扫描到了。。。

改密码时发现,失窃的这些账号都在 Chrome 中使用密码管理器保存了的账号,只在手机上用的一些账号并没有任何一个被盗。

至/upload/2023/04/google_how_to_save.jpg)

Chrome 如何保存密码

Chrome 会将密码的 SQLite 数据库文件保存在 %APP_DATA%/Local/Google/Chrome/User Data/Default/Login Data

解密文件%APP_DATA%/Local/Google/Chrome/User Data/Local State/

如何解密

实现参考

  1. 获取 secret_key

    直接打开解密文件,它是一个 JSON,可以从中提取到 encrypted_key 字段

    提取 encrypted_key

    接下来使用这个 encrypted_key 作为参数,调用系统提供的方法 [CryptUnprotectData](https://learn.microsoft.com/zh-tw/windows/win32/api/dpapi/ nf-dpapi-cryptunprotectdata?source=recommendations) 后,即可得到解密需要使用的密钥 secret_key

  2. 读取数据库中的加密密码信息

    连接到数据库(无需密码),可以发现账号信息、密码信息都在其中保存。其中的 password_value 字段,即为 AES 加密后的密码

    数据库管理软件打开

  3. AES 解密得到明文密码

    密码和密钥得到后,通过 AES 解密即可得到明文密码,配合数据库中的其他字段,网站地址、用户名都一并暴露辽

如何保护好自己的密码

换个浏览器?

Chrome 是 Google 的产品,那非营利组织的 Firefox 会不会好一些?不幸的是,所有主流浏览器的密码管理器都是不安全的,包括 Firefox, Edge, 甚至是国内的一些浏览器,而且无论平台。

而且相关工具代码已经开源,咱必须得保证电脑上所有的软件都是善意的,否则只要在一台已经登录的电脑上,在浏览器中保存的密码就等于公开。

咱在换浏览器的时候,可以便利的从旧浏览器导入密码到新浏览器,也说明了这个问题。

密码管理器?

首先必须明确一个事实,没有绝对安全的密码管理器。且不谈有没有后门都不清楚的商业、闭源软件,就算是开源软件,能确保无后门、不联网的也是如此,比如 KeePass,(并不是说 KeePass 做的不好,这是一款不错的密码管理器)。

为什么会这样呢,其实所有密码管理器都面临着这样的问题,它们保存密码的数据库被找到后如何保障安全,如果攻击者恰好知道密码管理器的实现,那么所作的加密将完全失效。

记事本?

密码管理器其实帮我们做了很多来保护密码,但仍会泄漏,原因在于攻击者比我们更清楚密码管理器做了什么。

但如果我们自己控制密码的存储、加密,比如直接在记事本中保存密码,或者自己造一个密码管理器,那么控制权会重新回到我们手上,但这往往要牺牲一定的便利性。

为方便记录,咱一直在一个文本文件里明文保存了自己全部账号的密码,但没有记录完整用户名,对应网站也只了自己能看懂的标记。在经历过多次劫持、挂马和本次的泄漏事故,均未发现泄漏的迹象。

明文保存密码肯定不如加密存储来得安全,但是咱自己控制了密码管理器的实现,密码文件位置、加密方式(可能都没有)均处于不确定的状态,这种方式如何破解呢,总不能全盘扫描吧?咱想不到办法了,看看 AI 怎么说:

把密码管理器的数据库文件藏在保密路径下或远程保险箱中确实可以增加一定的安全性,但是这并不是一种完全可靠的方法。 如果您将密码管理器的数据库文件藏在保密路径下,攻击者仍然可以通过特殊的技术或工具来查找这个文件,或者通过猜测或社会工程等手段来获取文件的位置。同样地,如果您将数据库文件存储在远程保险箱中,攻击者仍然可以通过入侵您的计算机或者远程访问的方式来获取数据库文件的位置和密钥。

可见,如果自己控制密码的存储和加密,则需要针对目标对象搞特别攻击,(能享受到这等待遇的玩家应该不多)

脑子?

不得不说这比任何加密、隐藏手段都有效。但记得给每个网站、账号都分配一个口令,因为网站本身的也并不一定安全。

无密码?

常见的无密码方式,如生物识别、二次验证(短信、邮件)、单点登录、动态口令等,但并不是全部网站都支持,此外带来便利的同时,也意味着将更多信息和隐私提供给相关网站。

参考