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

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

真事。

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

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

欢迎广大 V 友来体验哈!

小程序名称:账号助手。

小程序码:

15787 次点击
所在节点    分享创造
131 条回复
KyonLi
2020-10-05 23:28:42 +08:00
telegram 观光来的,味很冲
wevsty
2020-10-05 23:35:20 +08:00
@v2lhr
1 、开源是信任的基础,没有这个基础就不存在任何信任。没有信任确大谈安全是无意义的。

2 、我指的是密码管理器可以为被管理密码的网站的两步验证提供支持。
(比如 Apple 的两步验证,需要输入的那个 6 位按照时间变动的验证码)

3 、KeePass 的抗穷举是以拿到加密后数据为前提的。
抗穷举的实质是加大穷举出正确密钥的难度,KeePass 使用了 AES-KDF 或者 Argon2 来提高穷举密码的代价以降低穷举速度。
简单的说直线思维上:
AES( 密码 , 加密数据 ) = 结果
而使用 AES-KDF 会变成
AES( AES-KDF( 盐, 密码, 迭代次数 ) , 加密数据 ) = 结果
由于 KDF 的运算代价,在固定的硬件上可能需要近似的时间才能确定密钥是否正确,如果迭代的次数足够多那么你确定密钥正确的速度就会非常慢。
最终从效果来说,可能同一台机器上使用了 KDF 只能做到每秒穷举 1 个密码,而不带 KDF 则可以每秒穷举成千上万个密码。

4 、对于小程序,微信实质上就是操作系统。
如果对我 Windows 不放心,我还可以选择 MacOS,对 MacOS 不放心我还可以选择 Linux 等等等,而用你这个小程序,从头到尾都只能选择微信。
另外还有信任链的问题,信任链越长对信任的难度就越高。
要信任你的小程序需要同时信任底层的操作系统+微信,如果你不信任 Windows,那么在 Windows 上运行的微信同样也没有信任的基础。

5-6 、这些问题是一开始你就应该说明的,也许说明清楚有些人的看法会有所不同。
20015jjw
2020-10-06 00:16:40 +08:00
lol 信任腾讯
v2lhr
2020-10-06 14:09:23 +08:00
20015jjw
2020-10-06 15:34:45 +08:00
@v2lhr ??
jimmy3780
2020-10-07 01:22:45 +08:00
@v2lhr 我来解释一下,可能这个回复楼主没有懂

LOL 不是 英雄联盟

而是 Laugh Out Loud 笑得贼大声

所以整个句子就是:哈哈哈哈哈哈草,信任腾讯


@20015jjw 已帮忙解释 XD
20015jjw
2020-10-07 03:06:43 +08:00
msg7086
2020-10-07 06:32:50 +08:00
分享自己的经验、设计和代码,是件好事。
但是楼主对密码相关系统的了解还停留在比较基础的阶段。
比如说上面提到的抗穷举算法不知道,这就是个很大的坑。

大部分人都不是密码学专家,所以设计出来的密码学工具很可能会分分钟被人破解,造成重大损失。
你媳妇看到你发的贴被人回复成这样感到愤怒。那么当她把网银密码存在小程序里结果被人脱了库,家里的储蓄都被人转走了,她会不会感到愤怒呢?回复里提出的很多观点都是有其道理的。

不瞒你说,我也不是密码学专家,所以我绝不自己做密码学工具。
如果我需要这样的一个产品,我会去找 (1) 专业公司发布的工具,或者 (2) 经过专业人员审计过的开源工具。

不管怎么样,感谢分享,但同时警告,不要对非专业人员设计的工具抱有过高的安全期望。
这种「虚幻的安全感」是很危险的。
k3Sv1
2020-10-07 08:50:10 +08:00
对不了解的东西可以谦虚一点
k3Sv1
2020-10-07 09:00:15 +08:00
你以为大家说 lol 信任腾讯是在说腾讯不可信,其实是在说你信任腾讯+不信任其他服务商(境外)很可笑。

在没有可靠的信任链时,从安全的角度会认为都不可信。另外,信息安全里说的信任和日常用语的信任并不是一回事,而楼主似乎并没有这个意识。不然你这么“信任”腾讯,干嘛还要加密存储?
v2lhr
2020-10-07 10:20:33 +08:00
@k3Sv1 因为管理员可以在管理后台看到数据,所以数据不能明文存储
Netizen2
2020-10-08 12:49:44 +08:00
這種東西自己用就可以了!
yolee599
2020-10-09 16:35:03 +08:00
腾讯值得信任? 360 网盘,UC 网盘,115 网盘……一系列的事情让我不再相信任何一家云储存服务了,至少要本地 + 网盘双备份
acess
2020-11-24 21:43:14 +08:00
挖个坟……其实我有点心疼楼主。在安全 /技术问题上我是个糊涂虫,不过有些话我还是不吐不快。

首先就是开源与信任,虽然我是外行,但是,这方面有篇文章对我影响比较大(里面实际上转述了 Bruce Schneier 的观点),作者是江宏,标题是:
加密货币与区、块、链(三):什么是信任
不知道楼上朋友的看法,比如 @wevsty

其次,人是天生的政治动物,很多人考虑问题都不自觉地会带入政治思维(或者说 tribalism ),非我族裔其心必异(或者反之)。这一点上我也是个小白,所以不胡乱展开了,我提这个只是一种模糊的感觉。

不过最后很遗憾,我也还是不太欣赏楼主的作品。
虽然我也用微信,对微信的信任程度也很高,但是我的手机比较老旧,微信实际上也相对不常用,加载速度让我感觉很慢。

@chenshaoju
"国内隐私和数据保护做的确不好,先不说各种黑产,个人数据到处卖也不是什么少见的事情,这都 2020 年了,各种垃圾短信你也没少见吧?"
依我看,你说的这些问题,相比上文讨论的数据安全(保密)问题,范围一下子拓宽了太多。“各种黑产”“个人数据到处卖”“各种垃圾短信”这种事情,我不太了解国外是什么情况,但是,有证据表明国内就一定比国外差很多么?
其实我印象里,一提到国外的信息安全事故,我就想起信用卡信息泄露。比如 metzdowd 密码学邮件列表( bit coin 最初就是在这里发布的)的管理员就吐槽过,信用卡是世界上绝无仅有的,账号和密码是同一个字符串的系统。
连 Google 开发的 Chrome 都把 HTTPS 的描述改成了“您的信用卡信息不会外泄”——我不知道专业人士怎么看,但以我这个半吊子的眼光来看,我只能哑然失笑……
虽然在三五行字里描述实现了公钥密码的 HTTPS 能提供什么好处确实有点难,这很显然是想要让文字变得“通俗”,但是,这牺牲掉了信息的准确性。
即便是用了 HTTPS,在服务器和用户两端,都仍然是可能发生信用卡信息外泄的,比如系统被黑、被植入木马,这个木马甚至只可能是一个不起眼的恶意浏览器插件。而且据我所知 HTTPS 有些时候也并不是从头到尾都完全保密,很多时候为了让 CDN 能够工作,CDN 服务器实质上是进行了“中间人攻击”,完全知晓通信内容的明文。
acess
2020-11-24 21:50:48 +08:00
在信息安全方面,我作为一个用户,一直都感到很无力。就好像“暗云”引导区木马,“引导区木马”这个词听起来像是上个世纪的事情,毕竟现在新出厂的电脑默认都是 UEFI+SecureBoot 了,但是实际上这个东西并没有绝迹,各种“格式化重装还是蓝屏”(估计是只格式化了 C 盘,没重写 MBR 里的引导代码)还是经常出现。

上网,不知道是不是哪里有 XSS 漏洞,不知道是不是点了什么东西账号就会莫名其妙被劫持走,然后发个菠菜广告都是轻的,鬼知道里面的信息被轮了几次。

即便是关掉浏览器,也不知道系统里有没有什么奇怪的 dll,或者其他形式的木马偷偷潜伏在内存里。也许定期重装系统是个好主意,但是到目前为止我还是得过且过,懒得折腾。
acess
2020-11-24 22:31:50 +08:00
@chenshaoju
"微信小程序没办法在开发工具里方便的查看"
我没有开发过、也没有逆向过微信小程序。
不过就“跳一跳”这个小游戏来讲,我搜索过,看上去逆向并不是不可能,无非就是成本问题。而且反过来讲,就算代码是开源的,也很难说就一定没有暗藏陷阱吧。

还有,其实我本来就不想比较什么国内国外的问题(这貌似还触犯 V 站的忌讳了?也可以理解,毕竟这种事情吵起来没有止境),也不想给国内辩护。
怎么说呢,我也说声对不起吧,让楼主的帖子歪楼了,啰嗦那么多都是纯牢骚……
acess
2020-11-24 22:37:53 +08:00
@wevsty 关于 KDF,我有个理解,不知道是否正确:
实际上,密码只要稍微增加几个(可靠随机的)字符(也就是熵值增加),就可以起到和 KDF 类似的效果。
(也许现在的 KDF 不仅增加计算成本,还增加了内存消耗?这样情况又略有不同了)
换言之,KDF 只是一种缓解问题的手段,“成千上万倍”听起来很厉害,实际上未必有那么神奇。
wevsty
2020-11-25 00:01:34 +08:00
@acess
信任是个很宽泛的词语,不太好一概而论。
在本贴里的案例来说,信任分为 2 个层面。
1 、是对个人的信任。
2 、是对事实的信任。

对个人的信任每个人有不同的想法,你可以相信某个人不会刻意去做危害你的事情,也可以相信某个人会因为各种各样的目的来危害你。大多数情况下因为其不可证伪性,这个问题没有绝对正确的答案。

为了克服对个人信任的不确定性,人类需要可以证明或者证伪的事实来确保信任。
正确的开源本身保障了:
1 、开发者难以通过插入恶意代码来危害用户。即使用户自己不懂代码,只要一旦存在恶意代码会很容易被人审查到并且披露出来。因为源代码人人都可以看到,不可能所有审查代码的人都自己主动包庇开发者,所以我们可以相信恶意行为会被披露。
2 、通常开发者会直接提供二进制文件供用户直接使用,开发者仍然可能在二进制文件上动手脚,开源保证了如果用户不信任开发者提供的二进制文件可以自行来制作二进制文件。
基于这两点来考虑开源之后对开发者的信任就不再重要了。因为可以相信社会上一定存在懂代码的好人,所以如果有问题这么一群人一定会指出来。

政治因素无法扭曲这个逻辑过程,所以政治因素不会影响这个结论。


至于 KDF 的问题


增加密码的熵值并不能起到和 KDF 一样的效果,原因是对于这种对称加密来说密码必须是可重现或者可预测的,而增加再多的熵都只能是一次性的,并且增加的熵必须要以某种方式来保存,所以找到增加的熵的时间必然很短,这并不能起到抗穷举攻击的作用。

单纯给密钥增加一个随机熵的思想密码学上通常是用来预防查表攻击的。
原因是任意的加密算法只要给完全一致的参数都会得到完全一致的结果,所以对于常见的加密结果我们可以通过预先生成的结果来比对加快破解的速度。增加随机熵后因为随机熵不可预测,所以不可能预先生成结果来比对。
具体到实践上,一种典型的实践方式是使用加盐密码哈希,以此来对抗查表攻击。

使用 KDF 时要得到解密所需要的密钥就必须符合下面的过程:
解密所需要的密钥=KDF(密钥, 随机盐, 迭代次数)

尽管单次 KDF 运算所需要的时间很短,但是由于有迭代次数的存在,即使知道了全部正确的参数,不执行迭代次数次的 KDF 函数仍然无法得到正确的密钥。
迭代次数增加将会拉长得到解密密钥的时间,提高攻击者的时间成本实质上就是降低了攻击者再有限时间内能尝试密码的次数,所以说 KDF 是能抗穷举攻击的。
acess
2020-11-25 00:20:09 +08:00
@wevsty
首先,即便这个楼主开源了,可能还是有很多人不愿意信任他——恕我直言,(以我这个半吊子自己的感觉来看)我觉得这很大可能上并不是出于什么缜密的思考,而是出于某种(尤其是,很可能是经过刻意策划,宣传灌输进去的)偏见。至于受这种偏见影响会不会有害,这个其实是另外一回事(很多广告打得响的东西,说不定其实质量真不差)。这就是我为啥要提政治……我觉得几乎没人能在这方面完全免俗吧。

还有,说到开源,其实有个小细节:可重现编译( deterministic build ),这个貌似也就比特币一直在用。如果我没理解错,这个过程是:一样的代码,用同样的软件环境,经过同样过程,编译出一个字节不差的二进制代码,由此证明代码和二进制是对应的。
但是,因为有 Ken Thompson Hack 的存在,再有就是“即便开源、而且源码真的忠实地编译成了二进制,也未必能从代码中找到逻辑 bug”这个问题,好像这个概念本身还是有点鸡肋的。


后面给密码增加熵,我感觉你说的貌似是加盐?怪我表达不当。既然密码管理器就是个人用途,那我觉得好像不涉及撞库之类的问题。我只是觉得,KDF 这个概念本身应该也是可以“驱魅”的。
(我第一次看到 Argon2,是好奇折腾 Ubuntu 的 dm-crypt 、想搞全盘加密的时候。稍微搜了一下,好像设计确实考虑周全,加入了针对侧信道攻击和 GPU 破解的对策,对于后者,我感觉这可能和加密货币抗 ASIC 挖矿算法有点类似?然后说实话,我不知道这类设计到底有多有效,毕竟不少抗 ASIC 的 PoW puzzle 最后还是出现 ASIC 矿机了,效律比 SHA256 的情况差很多,但是仍然是碾压程度的高效)
acess
2020-11-25 00:26:53 +08:00
@wevsty 我第一次看到加盐这个概念时,也非常折服,印象中大概是“即便被拖库也仍然能保证安全”,但是后来仔细想了一下,现实中好像还是蛮鸡肋的——都拖库了,可能有价值的数据本来就已经一波带走了,说不定服务器后端什么的都被注入了恶意代码,被攻击者实时视奸着呢?
打个可能不恰当的比方,就好像 WinPE 破解 Windows 登录密码一样……即便不去破解出明文的登录密码,实际上系统里有啥,绝大部分也已经都一览无余了。
不能说这样没意义,意义还是很大的(我记得 Windows 账户密码实际上也确实被用来加密凭据,包括证书私钥、浏览器登录密码之类的),但是好像没有我这个外行一开始想象得那么神奇。

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

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

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

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

© 2021 V2EX