为了媳妇,我不得不重构了我的小程序。

2020-10-04 14:03:11 +08:00
 v2lhr

真事。

这个小程序是我大四的时候做的,用于记录自己的各种密码,但是数据只支持保存在本地。我媳妇也一直在用这个小程序,媳妇是做新媒体的,各种账号很多(应该保存了有四五十多个了),最近媳妇要换手机,但是数据没法迁移,因此直接推动了我重构了这个小程序。(当然我自己也一直有重构的想法,因为我自己也在用,且原来界面很丑!)

重构了之后支持云端存储数据。数据存储使用的是腾讯的云开发免费额度,有 2G,对于一个家庭来说完全足够了。数据加密方式支持使用 AES 和国密 SM4,加密密钥是主密码。

欢迎广大 V 友来体验哈!

小程序名称:账号助手。

小程序码:

15791 次点击
所在节点    分享创造
131 条回复
acess
2020-11-25 00:33:26 +08:00
@wevsty KDF 这个东西,我记得在哪里看到过,本来就是因为人脑想出来的密码熵值不够高(具体熵值有多少,貌似也是根据具体情况的,取决于破解者猜测密码的能力,“会不会编字典”,好的字典能大大缩小搜索范围),现实中想让人类想出熵值够高的密码又太难,所以就有了这么个既不打扰用户,又能弥补“人脑想出的密码熵值低”这个缺陷的技术。
所以……我就有了一个暴论:如果可以直接用靠谱的办法生成随机密码,然后人脑可以直接记下它,那(从个人使用角度考虑,而不是从“宏观”的视角来看)效果和用了 KDF 也差不多。
(如果一个密码在多个地方被重复使用,那问题就很大了……不过,能想到用密码管理器的人,让他不要犯这种低级错误,貌似也不难吧)
acess
2020-11-25 01:07:46 +08:00
@wevsty 我会想到这个暴论,主要是因为我看过对于比特币脑钱包的批评。
比特币的账本全部是公开透明的,就好像一个天然公开的“账户密码数据库”,而且没有加盐、没有 KDF——传统的比特币脑钱包就是把人脑想出来的密码简单地哈希一遍,然后就直接用作私钥了,接着,从私钥得到公钥、地址这个计算也没啥成本。
攻击者只要暴力穷举,找到私钥,就可以直接把币转走。

所以说,解决这个问题的对策,就是用轮次足够多的 KDF 加盐?

很显然这样就跑偏了,不是么。
如果我没理解错,KDF 对于攻守双方是平等的,想要 KDF 增加多少强度,用户自己在正常使用的时候也要付出等同的计算量代价。换句话说,引入 KDF 后,每次输入密码时,机器“卡”了多久,就代表密码被 KDF 增强了“这台机器能够在这么长的时间内,能够穷举破解出的密码”这么多的强度。

KDF 的轮次不可能无限地往上加,于是,通过 KDF 得到的强度提升也很有限。
换句话说,再怎么折腾 KDF,也不可能让本质上就不安全的脑钱包安全到哪里去。


现在比特币的钱包一般都是用一个助记词来作为随机种子生成私钥,最常见的 BIP39 助记词是 2048 个单词表里随机抽取的 12 个单词,用来编码表示 128bit ( 132bit 里有 4bit 被用作 checksum 了)的熵。

不过说实话,比特币貌似也并没有解决这个问题……而且 BIP39 助记词里也是用了 KDF 的(大概是因为除了 12 个单词本身之外,还是一个可选项 passphrase,也是人脑想出来的附加密码)。

现在主流的钱包会引导用户把助记词写到纸上,和柯克霍夫原则里的“密匙必须易于沟通和记忆,而不须写下”,也是背道而驰吧。
wevsty
2020-11-25 10:01:27 +08:00
@acess
假设 KDF 的迭代次数高到用户的 CPU 需要 10 秒来得出结果,对合法用户只需要支付一次运算代价。
一个简单的 6 位数字密码存在 10^6 ( 100W 次可能),假设平均尝试 50%的组合即可攻击成功。
那么攻击者在使用同型号 CPU (假设 CPU 为 16 逻辑核心)时攻击时间则需要 500000 * 10S / 16 = 312500S 大约需要 87 小时来攻击成功。
如果不使用 KDF,通常尝试一个密码只需要毫秒级的时间(或者更少),假设只需要 100MS 即可尝试一个密码,同等条件下只需要 500000 * 0.1S / 16 = 3125S 也就是大约 52 分钟即可成功攻击。

毫无疑问的,KDF 在这里显著的提高了穷举的难度,并且当 CPU 的性能发生改变时,能迅速有效的的抵消性能提升带来攻击成本降低。

KDF 的迭代次数在理论上是无限的(具体到实践中虽然是有限的但是数字非常大,大到你绝对不会想去用到那么大)。

P.S:在我个人的实践中,KeePass 对保存数据库密钥的 AES-KDF 次数是 50W-100W 次,这仅仅只需要 1 秒的运算代价(单核心的状况下)。

此外,不同的算法在不同的场景下,作用可能是不一致的。
比如某软件就是通过 HKDF (HKDF 是 KDF 的一种典型实践) 来变换加密的密钥,使用 HKDF 的目的主要是让密钥不会重复的使用,而不是为了要拖慢暴力攻击的速度。

比特币的技术细节我个人不了解,不做任何评论。
acess
2020-11-25 11:42:26 +08:00
@wevsty
简而言之,根据我的认识,KDF 是很有意义的技术,尤其是可以防止大规模、跨网站的撞库;但并不能因此神化它(不过我并没有说你有意在神化它)。

“成千上万倍”,这种叙述可以给人直观印象;但实际上,它真的有化腐朽为神奇的、不可思议的效果么?我感觉,未必。

我之前提到“KDF 和几个随机字符效果差不多”——我的这个叙述同样是不准确的。“合法用户只需要支付一次运算代价”,这个我还是知道的。


提比特币,是基于我之前提到的一个理解:“之所以会有 KDF,根本上是因为人类很难设置、记忆熵值够高的密码”。比特币用 12 个单词的助记词,即可表示 128bit 的熵,在我看来还是很有启发意义的,虽然实际上比特币钱包还是放弃了让用户记忆这 12 个单词(本来“助记词”这个名字就是“辅助记忆”的意思,不是么),转而引导用户把它抄写下来,所以还是绕回了问题的原点、没有很好地解决这个问题。
acess
2020-11-25 11:55:04 +08:00
@wevsty 回到楼主这个作品上……

其实网盘云备份,就不是黑箱了么?同样是黑箱不是么。要说封号,网盘同样可能封号,无非就是封号的缘由(以及几率)可能不太一样。

理论上微信小程序也许可以被腾讯篡改——这里我又要拿比特币类比了,比特币官网在推荐钱包软件时,有一个扣分项,就是“远程加载可执行代码”(案例就是类似 blockchain. info 、btc. com 之类的 web 钱包)——看上去微信小程序在这一点上就不幸中招了。
“远程加载可执行代码”为啥会成为扣分项,我觉得不难理解,应该还是因为“确认公开的源码是否对应实际执行的代码”这个问题吧,理论上网站如果被黑或者作恶,随时可以偷换成恶意代码。
但是呢,即便是讲究“去信任化”到极致的比特币,好像也没有在官网上直接“下架”这种有扣分项的钱包。虽然这确实是一个扣分项,但这个扣分项好像也并不至于那么致命吧。

最后,包括我自己在内,看到楼主这个帖子,可能很多人脑内第一个浮起来的概念是“国内 /国外”,哪怕想起“经过剪贴板可能不安全”都不是第一反应。
acess
2020-11-25 12:12:32 +08:00
@wevsty (啊,好尴尬……发完帖子才发现,其实网页钱包现在已经从比特币官网的推荐列表里删去了……不过我还不知道具体理由。稍微搜了一下,下架 btc. com 的理由貌似是 HSTS PKP 时间不够长)
wevsty
2020-11-25 12:13:29 +08:00
@acess
你应该去做威胁模型分析。
安全通常是要建立在一定前提下的,如果假设攻击者有无限的资源,无限的情报,无限的等等等,那就不存在任何安全。

以 KeePass 来举例我们以攻击者的视角来看,要得到用户密码必须具备 2 个条件:
1 、得到用户的数据库文件
2 、得到用户使用的主密钥
这两个条件缺一不可,把数据库备份到网盘上这一个单一的行为并不会导致密码泄漏,因为网盘不知道用户主密钥。
网盘服务商要是作为攻击者想穷举密码需要付出巨额的代价,这不符合经济原则,所以才可以确信数据库存在网盘上不会导致密码泄露。
至于网盘服务商封号,拒绝提供服务,也还是无法得到保存的密码,所以实际上跟安全性无关。
反过来也是一样,如果有人知道主密钥,拿不到数据库文件也没辙。

这里创建的先决条件有多难就决定了安全的上线在哪里,超过这个上线的讨论是没有意义的。
acess
2020-11-25 12:19:41 +08:00
@wevsty (稍微搜了一下,比特币官网的情况,貌似是最后一个 web 钱包被下架了,在这之后才连带删掉整个 web 钱包分类。最后一个 web 钱包是 Coin Wallet,不过下架的理由好像主要是没有告知的收费,貌似还不涉及“远程加载代码”这个问题)
acess
2020-11-25 12:29:16 +08:00
@wevsty
首先我没有假定攻击者拥有无限的资源……实际上放我自己身上,我肯定愿意用带有现代 KDF 的产品,以“输密码时卡上几秒”的代价,换取安全性显著提升(按我的理解,就是等效于密码被追加了好几个难记的随机字符,有了 KDF,我不用记忆它们也能达到一样的效果,更不用提对跨站撞库的防御),很显然是值得的。
不过,我也不知道一个现代的 KDF 在典型情况下到底能增加多少强度。

其次,我觉得“安全性”这个概念不止涉及保密性吧?可用性其实也是安全的一个范畴。比如勒索病毒把文件加密了,这很显然是安全事件,但是未必涉及泄密(虽然有些勒索黑客现在确实在用泄密作为要挟条件)。

“反过来也是一样,如果有人知道主密钥,拿不到数据库文件也没辙。”
确实是这样。但是我觉得有不少情况,比如电脑中键盘记录木马这种情况,都已经拿到主密钥了,这可能已经是整个系统被攻陷的情况(对于个人用户来说,管理员特权也许不是特别重要,就像 xkcd 1200 ),顺带着拿到整个数据库也就不是难事了。
wevsty
2020-11-25 13:03:54 +08:00
@acess
KDF 能为密码管理器这种用途增加多少强度这种问题并没有固定答案,因为 KDF 的算法,盐,迭代次数都是你自己定下来的,每个 CPU 的性能也是不一样,要加密的数据大小也未必是固定的,这里变量太多,没办法得到确切的数字。

只能说你用的 CPU 性能如果是顶尖水平,并且支付了对应的时间代价,那么其他人使用同等或者更差的 CPU 就需要尝试次数*代价时间 / CPU 核心数量次以上的代价。

当然,安全除了保密性还包括可用性之类的内容,这就是为什么要分析威胁模型。

有人直接物理上给你在 PC 上安装监视系统怎么去防护?
如果有人拿枪要你交出密码和数据库你要怎么防护?
如果有人能直接把你关进去,不让你接触密钥文件你要怎么防护?

如果你问我这样的问题我的答案是无法防护。

这种讨论实质上就是假设了攻击者无处不在(本质上无处不在也是一种无限资源)。
acess
2020-11-25 13:48:13 +08:00
@wevsty 我感觉你似乎有点误解。我并没有问 50 元扳手攻击这种问题(虽然我的想法和 50 元扳手攻击也差不了太多了)。

但是,如果你要问我,我能保证我的电脑系统完全干净么?我没有信心回答“能”——这并不是因为我把电脑物理上随随便便给了陌生人使用,而是因为我并不是个“清教徒”式用户,很多时候我也会“从网上乱下东西”(比如 V 站一直在抵制的,盗版 /破解)。

即便我说了类似“大概可以吧”,这样的答案,也是觉得“如果不这么想,那电脑就压根不能用了,因为每时每刻都有被害妄想(笑)”。

“有人直接 [物理上] 给你在 PC 上安装监视系统怎么去防护?”
很多时候并不需要物理上进行这个动作——当然,即便不是物理上这么做,这个问题大概也还是无解,甚至是没有什么意义。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/712481

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX