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

小白不懂就问大佬,后端在实现登录验证用户名和密码时,是用户名+密码的 hash 值去查库看是否有结果呢?还是只使用用户名查记录,然后拿结果的密码 hash 在程序中同提交的密码的进行比对呢?

  •  
  •   paullee · 2019-12-19 14:31:20 +08:00 · 1903 次点击
    这是一个创建于 1561 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如题
    google 搜索半天,估计是关键词没找对,没搜到相关的讨论,故来此伸手问问大佬们。
    第 1 条附言  ·  2019-12-20 09:54:22 +08:00
    看完各位大佬的恢复后,似乎方案 2 会更灵活点。
    随便小弟惭愧,目前对密码加盐的操作还不熟,现在就去补补知识。
    14 条回复    2019-12-20 09:52:31 +08:00
    littleylv
        1
    littleylv  
       2019-12-19 14:33:30 +08:00   ❤️ 1
    我用 2。
    我也觉得该用 2。
    gamexg
        2
    gamexg  
       2019-12-19 14:38:51 +08:00   ❤️ 1
    2

    为了对抗彩虹表,一般 hash 密码时会加随机盐(参考 BCrypt ),不方便使用方法 1。
    另外随着项目延续,密码加密方式可能变更,1 也不方便使用。
    paullee
        3
    paullee  
    OP
       2019-12-19 14:55:51 +08:00
    @gamexg
    @littleylv 谢谢大佬指点
    ThirdFlame
        4
    ThirdFlame  
       2019-12-19 15:10:35 +08:00   ❤️ 2
    注意 不管是没有查到这个用户 还是 密码不对。 给用户的返回提示应都为“用户名或密码错误”
    避免被枚举用户
    netnr
        5
    netnr  
       2019-12-19 15:32:19 +08:00
    我常用第一种方式
    mxT52CRuqR6o5
        6
    mxT52CRuqR6o5  
       2019-12-19 18:01:13 +08:00
    怎么看都是 1 更安全啊,你可以看看开源的项目都是怎么写的,我也没看出加盐哪里会不方便用方法 1
    qingzhan
        7
    qingzhan  
       2019-12-19 18:28:07 +08:00
    突然问出了心中疑惑,以前用二,现在公司用一,到底哪种好?
    woodensail
        8
    woodensail  
       2019-12-19 18:32:46 +08:00
    用户名单独传。
    密码方面,每次登录时由服务器生成一个一次性 token,然后该 token+密码一起 hash,然后传到服务端,服务端用存在 session 里面的 token 重复该步骤进行比较。
    这种方案的好处在于可以避免重放攻击,就算被第三方窃取到了 hash 结果也没事,下一次的 hash 肯定不一样。
    Depth
        9
    Depth  
       2019-12-19 18:38:37 +08:00   ❤️ 1
    很简单呀,从你提的 2 中场景来看,第一种好,但是如果你的第二中情况加盐值了,那就第二种好,因为你的第一种相当于一个固定盐了
    哈希(密码 加 随机盐) > 哈希(密码+固定盐) > 哈希(密码)
    luckyrayyy
        10
    luckyrayyy  
       2019-12-19 18:52:05 +08:00   ❤️ 1
    从 Spring Security 的思想来看应该是 2,因为他默认的加密方式得到的密码是带有随机盐的,每次都不一样。
    wdkty
        11
    wdkty  
       2019-12-19 18:55:53 +08:00
    存储在数据库里面的是 hash(salt&password)还是 salt&hash(password)?
    eason1874
        12
    eason1874  
       2019-12-19 19:52:45 +08:00
    @mxT52CRuqR6o5 #6 方法 1 只适合固定盐,如果你按高标准加盐让每个密码都有足够长的随机盐,那方法 1 就不方便。

    因为你每次校验都要有用户的 salt,既然都把 salt 查出来了那干嘛不把 hash 一起查出来,这样只要查一次,按方法 1 要查两次。
    DavidNineRoc
        13
    DavidNineRoc  
       2019-12-19 20:05:29 +08:00
    更倾向于第二种,现在很多哈希都把盐存到加密字符串了。 之后每次的盐都不一样,只能 check 出来,不能比对
    paullee
        14
    paullee  
    OP
       2019-12-20 09:52:31 +08:00
    @wdkty 目前暂对密码简单 md5 了一手🤦‍♂️。
    看完各位大佬的留言,我需要再去补补密码加盐(固定盐 /随机盐)的知识,之前尚未考虑到这点。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1038 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 68ms · UTC 22:36 · PVG 06:36 · LAX 15:36 · JFK 18:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.