我写了个登陆概念流程图,由于 V2EX 不能上传图片。所以改成文字说明。
说明如下
登录流程
|
|==》客户端
|
|——》拉盐
|
|——》密码加密
| |
| |——》 Hash(password) ——》 hmac(hash(password),salt)
| |
| |——》 非对称加密简单 hash 后的密码密文 ——》 rsa(hash(password),公钥)
|
|==》服务端
|
|——》加密
| |
| |——》 hmac(password,key)
|
|——》 验证密码 ——》 获得 User 对象 ——》验证密码,若能匹配,正确执行如下流程
|
|——》 非对称私钥解密 ——》 rsa(公钥加密的内容,私钥) ——》得到密码原始密文
|
|——》更改密码的哈希密文值和对应 salt
| |
| |
| |——》生成新 salt——》 hmac ( hmac(password,新 salt),key )——》 新 salt 和加新盐的密文密码更改入库。
流程写完了,如上所示,其中会用到的哈希摘要加密算法,是 sha512 和 hmac512,非对称加密用到了 rsa。目前没有正式应用该流程。
我这个有最后一个端是,如果用户登录密码验证成功,则生成哈希密码密文代替用户的旧哈希密码密文,先生成新盐,新盐与原始密码密文进行 hmac 加密替代旧盐加密码密文哈希 hmac 的密文。其中的 key 值是某个配置文件里的值。
现在问题来了,这个登录流程以及相关的,这些架构设计。各位看出来有哪些安全和稳定问题?各位能指出来吗?
1
ceet 2020-01-14 15:26:23 +08:00
如果一大堆用户频繁登录和退出,利用脚本。 估计 你的程序就完蛋了。
|
2
roscoecheung1993 2020-01-14 16:04:57 +08:00
不懂为什么要获取密码密文
|
3
GM 2020-01-14 16:06:54 +08:00
rsa 速度非常慢,你这个登录系统怕是撑不过 100qps
|
4
tctc4869 OP @roscoecheung1993 我已经说了,每次用户登陆成功之后,执行一个方法,通过解密得到的原始密码密文,生成新 salt 再哈希,再把新密码密文和 salt 更新到该用户中
|
7
hebingchang 2020-01-14 18:45:26 +08:00 via iPhone
话说服务端用 key 做的 hmac 是什么用意?
|
8
GM 2020-01-14 19:19:53 +08:00
@tctc4869 你的做法大概可以这么形容:
考试的时候,为了保证我的试卷不被偷窥,我在桌子周围垒起了一圈五米高的围墙,然后写下的所有答案都经过加密,老师必须要用我给的秘钥解密后才能给我阅卷。 |
9
ysc3839 2020-01-14 22:59:29 +08:00
https://www.infoq.cn/article/how-to-encrypt-the-user-password-correctly
之前看过这篇文章,打算以后都用 pbkdf2 算法了。 https://docs.python.org/3/library/hashlib.html Python 自带的 hashlib 就有 hashlib.pbkdf2_hmac,可以直接加盐,不需要自己做过多处理。 |
10
ysc3839 2020-01-14 23:05:23 +08:00
关于你设计的流程,我觉得如果客户端和服务器通信用的是 https 的话就没必要再进行一次 RSA 了。
个人建议客户端对密码计算 hash 再提交给服务器,服务器使用 pbkdf2 计算后再存入数据库。 |