用户口令(密码)应该如何传输?要不要加密? HTTPS 呢?举例分析

56 天前
 FengMubai

假设

口令在信道中传输时不会被窃取(就是未被安装伪造证书的 HTTPS ),但服务端被攻破

1. 明文请求登录和存储

攻击者得到了用户的口令明文,可以去其他站点尝试输入登录

2. 哈希请求登录和直接存储

攻击者得到了用户的口令哈希,可以构造请求去其他站点尝试登录

3. 哈希请求登录和加盐存储

攻击者在拿到服务端日志或执行权限时,可能获得口令哈希,然后构造请求去其他站点尝试登录

4. 加弱盐哈希请求登录和加强盐存储

例如,前端用SHA256($password + $hostname)请求登录,服务端用SHA256($hash + $salt)存储。 攻击者可能得到请求的哈希值,但因为加盐的存在,即便用户在其他站点使用相同口令,也无法重新计算哈希构造请求登录

总结

第 4 种方法是最安全的。当然我们作为用户,还是每个站点都使用独立口令最好

后记:刚拔完智齿,闲得无聊,把很久以前的思考整理成文

3798 次点击
所在节点    信息安全
54 条回复
kyuuseiryuu
55 天前
TLS 是传输层加密,传输层不可靠那就只能再往上一层那就是应用层加密了。
服务端的应用层那就是源码级加密。程序用私钥加密,通过启动器从环境变量加载公钥启动应用。这样即使攻破服务器也查看/修改不了源码,从而保护业务逻辑。
浏览器 -> 服务端则要求用户注册的时候保存用户的公钥,之后所有的请求需要用户私钥加密传输。服务端使用用户注册的公钥解密请求。这样只要保证用户注册时是安全的即可。用户的公私钥对要可以通过 yobikey 之类的东西实现。没错,就是以前的网银盾。
murmur
55 天前
@jdkxnktkdkxod 很明显楼主连加盐都没搞清楚,这玩意只能防止脱库后被逆出明文密码,然而现在是全实名制,人家已经改了 https 证书,进了你的服务器,就可以拿到代码逆向出手机号、身份证等更多数据

怎么说呢,除了不能给彩虹表提供数据,真的惨
EndlessMemory
55 天前
散列值+盐就行了,没有绝对的安全,增加攻击者的成本就行了
FengMubai
55 天前
@jdkxnktkdkxod “+”为自定义运算,你可以用简单的字符串拼接,$hostname 代表着前端的盐是一个公开的固定的值,$salt 是来自随机数发生器的和哈希等长的盐。也就是说,即便用户使用相同的口令,那么服务端接受到的请求中的口令字段,也无法用于去撞隔壁的站点;服务端再次加盐,就是常规目的了
FengMubai
55 天前
@murmur 很显然你并没有理解我想讨论什么。我并没有说这样做可以保护服务端被攻破时避免数据泄露,我只是想讨论,口令要如何传输(当然不传最好
murmur
55 天前
@FengMubai 你想太简单了,我都上了你服务器了,你的代码还是你写的么,我如果不想搞你直接删库留个比特币的勒索条子,想搞你我代码都可以给你改掉

你的前提是服务器被“我”攻破,那你所有的代码还是你之前写的吗
FengMubai
55 天前
@murmur 你说的对,你想的很全面,但是如果不设置一个假设范围的话,任何讨论都将没有讨论的意义
huihuimoe
55 天前
草,服务端都被攻破了,你还想着正经拿 post 内容构造???
直接改服务端插点 js 直接把所有用户动作上报不就好了,想要啥东西都给你传回来啊
FengMubai
55 天前
@huihuimoe 我总可以拔电源吧,尽管数据你都拿到了
FengMubai
55 天前
@huihuimoe 我说的构造 post ,不是“我”的站,是隔壁的站
EminemW
55 天前
@jinliming2 那啥,服务端就不应该明文存用户的密码,存明文密码有点窥探用户隐私的意思了
keithwhisper
55 天前
方案 4 比较有责任心, 不过大部分开发是没有这个心思的.

用户密码明文出现在服务端一侧, 就可以被社会工程学攻击, 以前就有过用户密码明文被日志记录的例子.

当然, 有人会骄傲地说, "你们日志不去敏, 你们不专业", 他们应该去看一下 "墨菲定律"

> Anything that can go wrong will go wrong.
hubaq
55 天前
服务端都被攻破,任何安全手段都是脱裤子放屁
panda1001
55 天前
前端 js 混淆后加密提交参数,至少增加了爆破门槛
hubaq
55 天前
@panda1001 服务器都被攻破了,加密也没用啊,我直接修改前端代码不加密
MFWT
55 天前
我可能有点敏感,不过我写的小项目也是用的方法 4 ,防重放肯定是做不到,但至少可以让明文密码不离开用户机(你说用户机被攻破了.......那算了)
SP00F
55 天前
😰 没有讨论的价值,服务器都破了。拿着你最高权限都懒得管你加不加密了
FengMubai
55 天前
@SP00F 看你愿不愿意把“当自己的服务被攻击时,保护用户在其他在站点的账户不被波及”当作安全义务了
FengMubai
55 天前
@MFWT 重放攻击是另外的话题了,如果你想讨论,可以新开一个贴
Tstxxy
55 天前
首先客户端的代码,花时间肯定能知道你的逻辑。
其次,服务器被攻破,花时间也肯定能知道服务器代码的逻辑。
因此,上面四种方案属于脱裤子放屁。

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

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

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

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

© 2021 V2EX