少数派发了一篇文章,偶遇“大神” fastQ

2025 年 7 月 13 日
 WngShhng

我前段时间在少数派上写了一篇文章,里面提到了文件端到端加密,我自己设计了文件加密格式,就因为里面用到了 RSA 算法,然后某“大神”不干了。原文的链接: https://sspai.com/post/100448

大神开始的评论:

端到端加密乱入了个 RSA 非对称加密,不知道你怎么设计的总觉得很业余…

说我“业余”,然后我就很不爽。于是我写了一篇文章专门分析了我的设计逻辑: https://juejin.cn/post/7524978296394350655

跟“大神”的其他讨论在评论区可以看到。

我 TM 就不明白了,我用 RSA 只是为了把用户的密钥记录到文件里,这本身是可选项,用来帮助用户忘记密码的时候还原密码,除外,我又没有用户的文件,根本不可能获取到用户数据。

使用 RSA 就是为了防止被破解,因为 Android 应用别人可以使用调试、Hook 和反编译等方式获取加密用的密钥,并不安全。

然后这“大神”依然不依不饶。说,

其二,端到端加密从来是在可信设备上,和你 Android 反破解无关。端到端加密是保护不被中间人攻击,而不是保护数据不被客户端读取,当你说出 Android 安全显然你连端到端加密是干什么的都不知道。

我赶紧我根本看不懂他的逻辑,有种驴头不对马嘴的感觉...

最后对于我的文章和设计方案,“大神”又发表了如下高见:

我最终还是点击了你这个掘金链接,看看你的文章,然后我发现了更多离谱的问题。
1. 你用了用户密码直接拷贝来加长……
你肯定不知道什么是密钥派生函数。一般来说用户输入密码,然后程序使用特定密钥派生函数派生出 master key ,然后再用 master key 来对文件加密。
如果考虑到在用户更改密码时不重新加密解密全部文件,那 master key 还要随机生成,然后使用上述密钥派生函数派生出的 key 去加密 master key 。
我觉得你可以去了解下 bitlocker 为什么改密码不用重新解密再加密整个盘。
而且密码派生函数可以增加暴力破解时间,你自己实现的这个 while (passcode. Length < 48) ,难评。
2. 按照 aes 标准,iv 应该随机生成,至于你这个 iv 生成方式不予置评;
3. 我终于看到了你奇怪的非对称加密的用途:
「这里的实现思路是,当写入加密文件的时候将用户设置的密钥通过 RSA 算法的公钥进行加密,并将加密的结果写入到文件。当用户忘记密钥的时候,可以读取加密文件的这部分区块,然后将这部分区块经过 Base64 编码之后上传到我们的服务器。然后,在我们的服务器上面,经过 Base64 解码成字节数组之后再使用私钥解密出用户的加密密钥。」
这个奇怪的算法不是只要拿到这个被加密的文件,谁都能解密吗?加密的意义是不认识这个软件的人没法解密?
但如果只要这点要求,完全可以软件内置密钥,甚至不用用户密码不是吗?
这部分在服务器上有意义?如果是服务器还要靠用户登录来验证用户,并且每个用户有各自独立的密钥对,确实有意义。但是这又多了一个要记的登录密码——e2ee 会忘记密码,这个就不会?
4. 拼接出 passcode 也就算了,还要从服务器把这拆回去?就不能直接返回 48 字符的 passcode 吗?反正加密解密时又会拼接回 48 字符……确实“很有意思”,我惊呆了。
5. 除了塞进一个魔术头外,真没必要设计一个文件格式,除了自己坑自己,容易因为缺乏足够多的单元测试导致丢数据以外没啥意义。想要紧凑的二进制格式,完全可以用 msgpack bson cbor 之类的序列化格式,甚至 protobuf 之流。
除了只能看出开发者知道的少,没看出什么……

看到这评论,我都不知道说什么好了……

  1. 他最终还是没输出使用拼接 48 位有什么问题
  2. “谁”都能破解,我不知道他怎么得出的结论;
  3. 他始终没明白为什么密钥放在客户端不安全;对于用户忘记密码,这和忘记文件加密密钥是两回事。
  4. 从 48 位解析出原本简单的密码只因为那是用户自己输出的密码……
  5. 对于文件格式,谁 TM 想要紧凑二进制了,他完全没搞懂我为什么要分区块。而 protobuf 这种……它能用来设计文件格式吗?这种格式虽然紧凑,但是不好维护。

在少数派里面,他的评论的点赞还比我多,看来很多人认可他的观点。

我就不明白了,这是真“大神”还是假“大神”。

因为少数派不是技术社区,开发者还要维护个人形象,本身处于弱势地位。 所以,我想在 v2 上面,都是做程序的,大家来评评理。

15045 次点击
所在节点    程序员
124 条回复
WngShhng
2025 年 7 月 13 日
@nbndco 那首先得 b 用户得有 a 用户的文件,其次 a 用户勾选了把密钥记录到文件的选项(这始终只是一个可选项
nbndco
2025 年 7 月 13 日
@WngShhng 你加密不就是为了防止 a 用户的文件被其他人获取后访问吗。按你这个设计我随便注册个账号就可以解密所有人的文件了?
WngShhng
2025 年 7 月 13 日
@nbndco 因为软件里的数据本身是私有化的,也就是存储在用户自己手机或者网盘上,所以,要想解密别人的文件,你得有他的文件,其次,如果用户觉得写入密钥的功能不妥,他可以不勾选,那么我们就不会写入,这样即便别人拿到自己的文件也无法破解,我提供这个功能只是防止用户忘记密钥,如果不勾选就需要用户自己记住密钥,仅此而已
oott123
2025 年 7 月 13 日
引入服务器在你这里确实给用户密码带来了一个薄弱环节,加密本就是为了防止文件被未授权用户查看,而你的服务器没有能力识别持有文件的人到底有没有权限获得这个文件,这就导致只要使用了这个备份密码功能,那加密就形同虚设。

如果你的观点是,别人无法轻易获取这个文件,所以是安全的,那加密也没必要了,反正别人也拿不到……

至于密钥派生确实应该选择成熟的派生算法,但自己做问题没有特别大,无非就是相对弱了一点。
nbndco
2025 年 7 月 13 日
@WngShhng 如果你觉得用户 a 的文件永远都不会泄露,那你加密他干啥???加密的假设不就是文件会泄漏吗?
zhy0216
2025 年 7 月 13 日
派生算法你确实要被喷
WngShhng
2025 年 7 月 13 日
@oott123 密钥派生这点没问题。加密过程中是可以不勾选将用户密钥写入的,那么这样就是单纯的 AES 加密,我加这个功能只是一个可选项......防止用户忘记密钥,如果不勾选就需要用户自己记住密钥,那么即便别人拿到文件也无法破解啊
oott123
2025 年 7 月 13 日
@WngShhng 但只要这个功能被用户选择,加密就形同虚设。用户并不知道它选择了这个选项之后会将加密的安全性降低到明文级别,你给了用户虚假的安全感。这是不好的。当然我理解产品上需要一个找回密码的功能,但你需要重新思考它,起码,给每个用户分配一对独立的密钥吧?
WngShhng
2025 年 7 月 13 日
@oott123 我在应用的帮助文档里面有简单的说明。分配独立的密钥,技术上可以,但是会增加应用使用的复杂度,如果引入太多的东西,容易让用户费解
nbndco
2025 年 7 月 13 日
@WngShhng 这个加密已经在所有层面上形同虚设了,你还在纠结用户可以不用这个功能或者用户无法理解…… 我也不知道那个 fast 说的对不对(我没看),但是你这个功能是彻头彻尾的错误
yahon
2025 年 7 月 13 日
如果只是想笔记不被除了自己的其他人查看,那么至少需要:
1.自己只能在可信设备上查看。
2.如传输,存储等需要保持加密状态。
3.密文需要能解密,解密的密钥用户自己保存。

至于用户怎么保存密钥就是另外的话题了。太复杂了容易忘,简单了容易猜。
WngShhng
2025 年 7 月 13 日
@nbndco 这怎么就形同虚设了呢…你不选择它不就完了吗,我提供给用户的只是一个选项
oott123
2025 年 7 月 13 日
您确实是一点儿也不愿意考虑产品决策对用户数据安全性的影响。关于安全性的讨论就言尽于此吧。

怎么说呢,这可能会让你能做个好的产品,但不会是个安全的产品。
nbndco
2025 年 7 月 13 日
@WngShhng 你有告诉用户一旦选了这个选项虽然名字里写着加密但实际上加密就失效和明文一样了吗?这就是你的产品吗,告诉用户我们加密了但实质上和明文一样,然后质问用户你为啥要选?
WngShhng
2025 年 7 月 13 日
@oott123 如果用户对安全性有更高的要求,那么他只需要不勾选写入逻辑就可以了。
butterflydog
2025 年 7 月 13 日
大神说的在理,尤其是 1-5 的意见点。别辩了,你们的沟通不在一个维度上
WngShhng
2025 年 7 月 13 日
@nbndco 这“和明文一样”我不知道你怎么得出的这个结论…因为我没有文件,所以我无法解析用户的文件。我觉得你的这种担心纯粹多余,因为如果我想获取用户的内容,用户输入的时候就可以获取。
lloovve
2025 年 7 月 13 日
@butterflydog 感觉他有点太扛了,大神已经说的挺明白了,他楞是好像看不懂一样。
oott123
2025 年 7 月 13 日
自始至终您都只考虑了您作为服务商无法获取用户内容,而从未考虑过作为用户亦可能泄漏内容。

作为服务商,您从未收集用户内容,因而加密与否都不会增加安全性。作为用户,若泄漏了勾选该选项的文件,加密与否都不会影响内容被泄露。

因此,从用户的角度来说,勾选之后,加密的确和明文一样。

而且这么多人帮您解释,您甚至不愿意点个感谢,还指望这里的用户帮您拉架,这实在是太符合我对少数派撰稿人的刻板印象了……
nbndco
2025 年 7 月 13 日
@WngShhng 可能我对于安全的理解和你不同,似乎加密这个行为对你来说只是个 buzz word 。

你的产品的安全性完全建立在攻击者无法获取到用户的数据的前提下(我不懂这个前提下加密的意义)。一旦攻击者获取到用户数据,你精心设计了一套迷惑用户已加密但是把所有解密密码拱手送给攻击者的机制,确保加密完全失效。

确实也没啥可聊的了。

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

https://v2ex.xtra.eu.org/t/1144850

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

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

© 2021 V2EX