为安全问题,早上公司热烈讨论

2022 年 8 月 31 日
 wenzaiquan199
场景:用户在前端绑银行卡,实名认证,前端通过 https 请求,明文将数据传给后端,故测试给我提了个 bug 要我前端加密传输,我网上搜了搜,觉得前端目前拿不出什么方案加密比 https 安全

测试:你这个东西加个密传给后端
我:有 https ,有一定的安全保障了
测试:但是我接口请求能看到我的身份证号什么的
我:你能拦截到别人的请求么
测试:那肯定有人能拦截到
我:我随便加个加密可以,我们代码没做混淆,别人看代码直接知道什么加密方法,随便解了,别人能从 https 把这个解析出来,破解我们这个跟玩一样,加了有意义么
测试:我之前公司都做了啊

遂测试找前端 leader 说,然后后端 leader 就说前端传过来不用加,后端给前端加密的数据就行了,前端 leader 说要,然后他们吵了半天

末了前端 leader 跟我说,要有“安全意识”,我直接回你项目混淆都不做,我从加密库找个现成的加密方法,有用么

遂结束,我也不理 leader 了,来看看大家什么意见
17096 次点击
所在节点    问与答
188 条回复
sucai
2022 年 9 月 1 日
看上去感觉你们前端 leader 好像很蠢,测试不按流程提 bug 他不帮自己人怼回去,这是在干嘛。他认为把加密这部分工作抢到前端做可以给你们加一点点话语权?
blackshow
2022 年 9 月 1 日
@lakehylia #160 套娃没什么卵用,安全是建立在密钥存储安全和密码算法安全的基础上,算法一旦不安全了,套多少层都没用
而且 SSL 在应用层和传输层之间,套娃只能做到应用层。
不要试图发明算法或者类似这种加密的小手段,有标准协议消停用标准协议,制定协议的时候考虑的情况远比抖机灵时考虑的全面
junmoxiao
2022 年 9 月 1 日
前端加密只是为了防爬虫,防不了黑客
dingyaguang117
2022 年 9 月 1 日
@Chihaya0824 想怎么分发就怎么分发呀,HTTPS 基于 tls 就能替代 tls 了?
dingyaguang117
2022 年 9 月 1 日
@twl007 囧 无言以对 不想反驳了
dingyaguang117
2022 年 9 月 1 日
这楼真能看出程序员平均水平…
yungo8
2022 年 9 月 2 日
看很多人说 base64 的,有些知道 base64 的不让用 base64 呢……你说气不气人……
Chihaya0824
2022 年 9 月 2 日
@dingyaguang117 没,关于分发的公钥没办法可靠的验证的问题,tls 不是比较好的解决了,就随便调侃了一下。我也没说 https 就替代了 tls 了嘛(狗头保命现在都没用了嘛 hhh ) 或者你有什么比较好的解决这方面的建议嘛,我也想学习一下
felixcode
2022 年 9 月 2 日
如果用个 https 就解决问题了,为什么还有这么多公司哈希处理和存储密码呢。
m2276699
2022 年 9 月 2 日
@Al0rid4l 看你这么说,说明你是真的年轻。非绝对安全就不做?有绝对安全嘛?
dingyaguang117
2022 年 9 月 2 日
@Chihaya0824 只需要套一层非对称加密就行。因为 HTTPS / TLS 中验证公钥是基于证书链的,在不受信任的电脑上会很容易被中间人攻击。但是自己分发公钥就不一样了,可以固定写在源码里,也可以单独下发。别人想中间人攻击得改你的源码(下发响应),无疑是增加难度的。 使用标准 HTTPS 别人一旦针对 HTTTPS 做中间人,所有网站都跑不掉。你自己专有的加密逻辑,工攻击者需要专门针对你的代码逻辑进行攻击。

具体实践可以参考微博登录,就是使用了 RSA 加密后传输。
Chihaya0824
2022 年 9 月 2 日
@dingyaguang117 原来如此,这确实是增加了难度
xiaochena
2022 年 9 月 2 日
@daveh 我知道非对称加密算法、这里主要的问题是、除非你密钥高频随机、不然和泄露也差别不大吧。
Depth
2022 年 9 月 2 日
你们说的都是技术层面的,我说一点合规的,任何三方来检查,前端传递密码未编码或者加密都是扣分项,
xiangyuecn
2022 年 9 月 2 日
https 保你数据安全到达接入服务器,至于后面的安全嘛,必须靠加密保证。

不用讲中间人带来的威胁,那是 https 的事,银行的那些现代网站也没办法;要信任正常的 https 能把数据安全的传输。

就像明文密码要不要加密,是同一个问题。

你猜你的 nginx 到自己服务器是用的啥传输的?你猜有没有哪个地方把请求数据都存了一份纯文本?
twl007
2022 年 9 月 2 日
@dingyaguang117 说实话 不受信的电脑为什么一定要从你的浏览器拿数据 键盘记录器之类的都多了

而且电脑都不授信了 人家拦截一下你的响应修改一下你的公钥有有多难呢 早些年运营商各种劫持还历历在目呢 甚至还有修改下载地址的呢 而且这是前端 又不是一个单独的登录用的 app

另外你写死公钥也是不安全的行为 这个也是跟安全相抵触的 只是让你的程序看起来了安全罢了 而且你在前端打算怎么校验自己收到的公钥就是没篡改的呢? HTTPS 至少还依靠证书信任链来校验一下 你前端打算自己实现一套类似的信任链来校验你的公钥么?

微博那套逻辑放在 https 没有普及的年代有意义 但是现在都是 HTTPS 了 如果你连 HTTPS 都不信过 那你自然也信不过现在所有的加密体系了

而且不仅 HTTPS 很多其他的协议都用的 TLS 作为加密传输层 那么你觉得其他协议是不是都得自己再套一层加密才信得过?
dingyaguang117
2022 年 9 月 2 日
@twl007 拦截篡改你也得知道改哪儿才行。
dingyaguang117
2022 年 9 月 2 日
@twl007 要是 HTTPS 就够了要那么多安全等级标准干什么,一个标准就够了
twl007
2022 年 9 月 2 日
@dingyaguang117 而且这个问题是个死循环 不信任 https 带来的麻烦远比用户名密码大得多

刨去登录的部分 用户浏览的东西要不要加密?你要不要确认用户浏览的东西没有篡改 会不会让人直接拿到用户正在浏览的东西? 这么做下去的话那就变成用户不要通过网络看东西了 直接抱着显示器去接着服务器看最安全?而且写所有问题的根源就是 HTTPS 不可信?

说真的 HTTPS 真这么不可信的话 AWS S3 早就用私有协议去设计了 而不是依赖于 HTTPS 了

StackOverflow 上也有人跟你有一样的观点 反驳的观点在这里 https://stackoverflow.com/questions/3391242/should-i-hash-the-password-before-sending-it-to-the-server-side

另外就是随便设计一个看起来安全利用了 RSA 的系统就真的安全么? TLS 的设计并不是一拍脑袋就想出来的那么简单
twl007
2022 年 9 月 2 日
@dingyaguang117

安全是个体系 又不是只靠某一个技术来决定的

对于前端而言 保障数据传输中没法被人拦截篡改才是最重要的 至于要怎么脱敏 加密处理 存储这些都是后端该干的事情 远不是仅仅一个 HTTPS 就能做到的事情 而且刨去加密 授权 /鉴权也很重要啊 只不过加密反倒是所有问题里面最简单的一部分也是最成熟的一部分 才会老被人提起来

至于你不停推崇的微博 RSA 登录加密 各种爬虫模拟教程 技术解析满天飞 好像真的打算篡改也没你想的那么难吧?

利用成熟的 TLS 远比自己拍脑袋像一个看起来安全的方案要安全的多

而且用户名密码现在越来越少见了 其他很多验证技术都在解决需要明文密码的问题 只是国内的环境根本铺不开罢了

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

https://v2ex.ih06.com/t/876693

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

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

© 2021 V2EX