
我写了个登陆概念流程图,由于 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 计算后再存入数据库。 |