盼大佬解答,前端加密到底是不是脱裤子放屁?

330 天前
 userKamtao

闲暇之余,探索了一个小伙伴的开源网站,无意中发现了他的修改密码接口,是明文传输的,如下图。

后来我跟他反应了这个问题,我的观点是应该在前端 md5 加密一下,他说,他在后端做了加密处理,明文传输没问题,网站是 https ,前端加密不就等于脱裤子放屁吗?

和他几番讨论之后,无果,也有几个小伙伴觉得前端加密等于自己骗自己。

我经验比较单薄,以至于没有什么实际上的论点去论证,希望有大佬解答一下,这种场景在前端加密有没有意义。

33627 次点击
所在节点    程序员
336 条回复
kneo
330 天前
@userKamtao md5 聊胜于无。它的问题:

第一,md5 的输入和输出是多对一的关系,对无限数据来说当然不可逆,但是用户密码都是短数据,你如果把用户密码显示在比如 16 位 ascii 字符的范围内,在这个有限的输入集里,碰撞相当少,可以认为是“可逆”的。

第二,md5 属于很落后的算法,应该是有方法可以暴力逆向的。学术方面的研究我就不花时间搜了。即使是普通用户也可能通过 md5 库查询到原始密码(即使你加过盐)。

第三,即使 md5 是不可逆的,它有一个特性,就是同样的密码,md5 结果一定是一样的。如果有人捕获了你传过去的 md5 ,下次就可以用这个 md5 登录。这就相当于一个永久性的 token 。一个好的加密算法应该每次都生成一个不一样的,不能重用的 token 。
sakilascott
330 天前
打个比方,你们公司的运维想窃取用户密码,但他没有 dba 权限,如果明文,他就可以在服务器日志获得。
kneo
330 天前
@996jiucai 没错,一般用户不会看这个。但只要有一个用户注意到了可能就会晒到网上然后变成扯皮。有人可能觉得没必要浪费时间实现这个功能,我的角度是没必要浪费这个时间扯皮。
luoway
330 天前
@kneo #101 第三很对,相当于把密码从人类可读转换为无意义的密码,依旧是明文密码与后端通信。

简单的前端加密可以认为是脱裤子放屁。
合理的加密是前后端配合,以保证每次通信或者每个会话期间是不同的加密结果。
libinglong9
330 天前
这个问题我深入研究过,对于秘钥的传输,正确且安全的做法是前端使用慢 hash ,后端使用快 hash 。

前端慢 hash 用于防止暴力撞库。后端快 hash 则是为了防止数据库,日志等被非法入侵或者数据泄露等造成的秘钥泄露问题。
userKamtao
330 天前
@kneo 你说得不无道理,如果是一个钓鱼网站,前端代码在他那,想钓你的密码,也是很简单的。主要还是防止服务端,如果是很乱的公司,指不定有屌毛把明文输出到日志,然后把日志发给外包排查。
huijiewei
330 天前
不要用 md5 , 要用就用 argon2
eber
330 天前
此贴终结吧!这帖子说来说去就俩问题:
1. 首先从能不能破解这一层来说:前端加密不算脱裤子放屁,因为两套 RSA 可以保证无法在前端被破解。

其次讨论你这个离谱前端 md5 传值到服务端的问题

2. 无论业务场景是否需要前端加密 都不应该选择前端 md5 传给后端,应该选 1 中的方式。
3. 从企业的角度考虑任何到服务端的数据都应该能被服务端计算出实际值,所以还是选择 1 中的方法。
userKamtao
330 天前
@luoway 第三点,那就算不是 md5 加密,有人捕获你的密码也一样能重复登录;这里使用 md 加密的逻辑是,不让别人知道你的密码,然后去其他平台登录,我是这个意思。
Kaiv2
330 天前
@shakoon 客户端 C 可能泄露,请求获取的 D 可能泄露。CD 对称加密 X 。弯弯绕绕可能复杂了一点。唯一有用的是 非对称的 G, 加密了 C 传送给了服务端
zhw2590582
330 天前
我发现我平常访问的知名网站都是明文传输密码的
mxT52CRuqR6o5
330 天前
你先调研看看那些大厂比如 google 微软的密码是咋传的,而不是啥都没研究过全凭自己想象就去指挥
Ritr
330 天前
加密可以有效防止脚本
Kaiv2
330 天前
基于用户角度考虑是有用的, 服务器被黑了,也没法捕获到真实密码(除非暴力计算)
Kaiv2
330 天前
@Kaiv2 坏处就是如果有多端登录需求,都需要统一算法
eber
330 天前
@Ritr 现在有很多可以调用 Chrome devtools 的库了,直接模拟用户输入和鼠标点击操作,所以针对防止自动化脚本这个层面没啥用。你自己可以试一下这个 - chromedp 库
userKamtao
330 天前
@mxT52CRuqR6o5 大佬,你别生气,因为谷歌和微软业务需要在浏览器记录你的登录密码。
liuhuihao
330 天前
@userKamtao #94 后端在很多场景下需要拿到 明文密码的,就最简单的例子就是校验密码是否复合规则,长度、大小写一类的,这个校验的事儿肯定不能只放到前端做,然后你前端给 md5 了后端就没法校验了都
lasuar
330 天前
不管是传输还是处理端,都应该避免出现明文密码。

1. 比如你能够通过 F12 看到传输的密码明文就是不合理的(当别人用你的电脑时就可能看到);前端( app/浏览器等)应该对输入的密码编码/加密传输,具体方式根据系统安全要求实施,比如从安全性低到高:baseN 编码、哈希算法、对称加密、非对称加密。如安全要求较高,则还可以使用二进制协议如 protobuf 传输数据,杜绝通过 F12 查看到可读文本的可能。

2. 后端一般收到的是处理过的密码文本(不应该能逆推出明文),比如哈希、或加密过的哈希,二次处理(可能需要解密)后再将其写入 db 或与 db 存储的密文进行匹配验证。( db 存储的一般是密文二次加盐后的字符串,不应该是明文密码)

这样前端后端都无法获得密码明文,将密码暴露的风险降到最低。
crysislinux
330 天前
属实没必要
1. 假如你们这项目就是个蜜罐专门骗用户密码的,那没必要搞这个
2. 如果你们是正常项目,后端拿到明文就加盐加密了,怎么泄漏,也没必要搞这个

用户已经被教育不要在多个网站用相同密码了,如果你还想提高安全性,上 mfa

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

https://tanronggui.xyz/t/1025454

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

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

© 2021 V2EX