V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
tctc4869
V2EX  ›  问与答

我弄了一个用户登录的密码安全加密策略,各位来看看有什么问题指出么?

  •  
  •   tctc4869 · 2020-01-14 14:16:31 +08:00 · 2021 次点击
    这是一个创建于 1793 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我写了个登陆概念流程图,由于 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 值是某个配置文件里的值。
    
    现在问题来了,这个登录流程以及相关的,这些架构设计。各位看出来有哪些安全和稳定问题?各位能指出来吗?
    
    12 条回复    2020-01-15 17:14:43 +08:00
    ceet
        1
    ceet  
       2020-01-14 15:26:23 +08:00
    如果一大堆用户频繁登录和退出,利用脚本。 估计 你的程序就完蛋了。
    roscoecheung1993
        2
    roscoecheung1993  
       2020-01-14 16:04:57 +08:00
    不懂为什么要获取密码密文
    GM
        3
    GM  
       2020-01-14 16:06:54 +08:00
    rsa 速度非常慢,你这个登录系统怕是撑不过 100qps
    tctc4869
        4
    tctc4869  
    OP
       2020-01-14 18:24:46 +08:00
    @roscoecheung1993 我已经说了,每次用户登陆成功之后,执行一个方法,通过解密得到的原始密码密文,生成新 salt 再哈希,再把新密码密文和 salt 更新到该用户中
    tctc4869
        5
    tctc4869  
    OP
       2020-01-14 18:25:02 +08:00
    @GM 那有比较好的替换方法么?
    tctc4869
        6
    tctc4869  
    OP
       2020-01-14 18:30:41 +08:00
    @ceet 是服务端一次 rsa 解密和三次 HmacSHA512 加密慢造成的么?
    hebingchang
        7
    hebingchang  
       2020-01-14 18:45:26 +08:00 via iPhone
    话说服务端用 key 做的 hmac 是什么用意?
    GM
        8
    GM  
       2020-01-14 19:19:53 +08:00
    @tctc4869 你的做法大概可以这么形容:
    考试的时候,为了保证我的试卷不被偷窥,我在桌子周围垒起了一圈五米高的围墙,然后写下的所有答案都经过加密,老师必须要用我给的秘钥解密后才能给我阅卷。
    ysc3839
        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,可以直接加盐,不需要自己做过多处理。
    ysc3839
        10
    ysc3839  
       2020-01-14 23:05:23 +08:00
    关于你设计的流程,我觉得如果客户端和服务器通信用的是 https 的话就没必要再进行一次 RSA 了。
    个人建议客户端对密码计算 hash 再提交给服务器,服务器使用 pbkdf2 计算后再存入数据库。
    tctc4869
        11
    tctc4869  
    OP
       2020-01-15 09:06:48 +08:00
    @ysc3839 现在都提倡慢哈希函数么?拉盐 hmacSha512 都不提倡了吗?
    ysc3839
        12
    ysc3839  
       2020-01-15 17:14:43 +08:00 via Android
    @tctc4869 这是那篇文章的建议,现实中用的多不多我也不确定。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2982 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 11:40 · PVG 19:40 · LAX 03:40 · JFK 06:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.