• 请不要在回答技术问题时复制粘贴 AI 生成的内容
blessleroy
V2EX  ›  程序员

如何保证 Cookie 自动登录的安全性

  •  1
     
  •   blessleroy · Jun 22, 2017 · 5940 views
    This topic created in 3274 days ago, the information mentioned may be changed or developed.

    一般自动登录,也就是“ remember me ”的功能都是利用 Cookie 实现的,这里就涉及到一个问题,Cookie 里到底怎样存放数据才能保证系统的安全

    看到很多简易的系统,直接保存了 Username 和 Password Hash,这样子设计在自动登录时可以直接传入数据库验证。但缺点是容易暴露系统的加密算法。

    请结合你的项目谈一谈 Cookie 自动登录的系统设计

    27 replies    2017-06-23 13:43:20 +08:00
    oh
        1
    oh  
       Jun 22, 2017 via iPhone
    哪个系统会去保存 Username 和 password hash 太扯淡了…
    最简单的难道不是保存登陆之后的 session id 或者 token 吗
    tony1016
        2
    tony1016  
       Jun 22, 2017
    简单一点,放个随机数,后端记录随机数是谁不就得了。注意定时清理
    FrankFang128
        3
    FrankFang128  
       Jun 22, 2017 via Android
    用有时效的随机数
    weyou
        4
    weyou  
       Jun 22, 2017
    保存在 cookie 里等着被 CSRF ?
    bravecarrot
        5
    bravecarrot  
       Jun 22, 2017 via iPhone
    客户端放 sessionid 不就可以了吗
    服务端维护一个 hash 表
    misaka19000
        6
    misaka19000  
       Jun 22, 2017 via Android
    槽点太多,不知道怎么说了,还是楼下来帮帮楼主吧
    imn1
        7
    imn1  
       Jun 22, 2017
    哪个网站放 password hash 的?我马上去拦截
    binux
        8
    binux  
       Jun 22, 2017
    remember me 不就是加大 cookie 的有效期吗?和普通的登陆有何区别?
    pekingzcc
        9
    pekingzcc  
       Jun 22, 2017   ❤️ 1
    remember me 实现 可以这样简单理解 : 用户登陆后,服务端生成一个有时效性的 token,然后放回 cookie 中,下次登录直接验证 token,并生成一个新 token 覆盖。至于这个 token 是啥,简单的可以是个随机数,复杂点的会利用一个大的随机数以及加盐哈希共同验证,直接利用 Username 和 Password 做 hash 是很危险的,如果 lz 有使用这种方法,建议修改。
    abcbuzhiming
        10
    abcbuzhiming  
       Jun 22, 2017
    敢把 password hash 放客户端。。。。
    crayygy
        11
    crayygy  
       Jun 22, 2017 via iPhone
    一般存 token or session id,服务端检验
    jarlyyn
        12
    jarlyyn  
       Jun 22, 2017
    这和 cookie 有啥关系…………

    一般登录信息是通过 session 存的。

    一段时间之前流行 cookie based session,也就是将数据加密存在 cooke 中。

    但是,没见过 session 里存密码或者密码 hash 的。
    eoo
        13
    eoo  
       Jun 22, 2017 via Android
    PHP password_hash() 放 cookie 路过,会被打死吗?
    gdsagdada
        14
    gdsagdada  
       Jun 22, 2017
    “看到很多简易的系统,直接保存了 Username 和 Password Hash,这样子设计在自动登录时可以直接传入数据库验证。但缺点是容易暴露系统的加密算法。”,你再搞个随机字段生成一个 uuid 不是从用户名来的不就得了吗?
    v1024
        15
    v1024  
       Jun 22, 2017 via iPhone   ❤️ 1
    将 cookie 对称加密,配合 secure-only,可以在客户端存任何信息
    bumz
        16
    bumz  
       Jun 22, 2017
    缺点是暴露系统的加密算法——就这一句话,你这帖子我没话说。
    zpf124
        17
    zpf124  
       Jun 22, 2017
    看来我们的项目也应该被打死....

    我们的方法是 存 username + 时间戳 + hash( username + passowd hash + 时间戳 + 内部自定义 key )
    zpf124
        18
    zpf124  
       Jun 22, 2017
    另外 加密算法暴露了 没什么可怕的,除非你加密方法是 md5。

    只要你的加密方法够高级,以现在的技术还远远无法破解就够了。

    别人知道了你用的是 PBKDF2WithHmacSHA1 或者 bcrypt 又如何? 既不知道 salt 又不知道迭代次数谁能破解。
    jybox
        19
    jybox  
       Jun 22, 2017
    @v1024 重放攻击
    ech0x
        20
    ech0x  
       Jun 22, 2017 via iPad
    bcrypt 这种利用 hash 时间的将 password hash 放在 cookie 里的问题在哪里呢?如何解决呢?
    skylancer
        21
    skylancer  
       Jun 22, 2017
    说了一堆,就没一个人想到重放攻击
    skylancer
        22
    skylancer  
       Jun 22, 2017
    ..额 19 楼讲了
    好吧,没看到
    Wuxj
        23
    Wuxj  
       Jun 22, 2017
    phithon
        24
    phithon  
       Jun 22, 2017
    存:将用户账号+时间戳,进行签名。
    将用户账号+时间戳+签名,进行加密。
    将密文存入 cookie。
    取:解密 cookie
    取出签名,和用户账号+时间戳进行比对。
    比对成功,再将时间和 now()进行比对,未超出 remember 的时间(如一个月),则校验成功。
    记录 session。
    izoabr
        25
    izoabr  
       Jun 23, 2017
    你的提问有 bug,不过我提个新的思路。

    之前存 sessionid 到 cookie 也确实有被劫持风险的,所以 cookie 里高级一点的我们会拿本地特征作为 salt+ID 进行验证,验证匹配才认可 session
    killerv
        26
    killerv  
       Jun 23, 2017
    我还没见过保存 password hash 的,一般都是本地 cookie 保存一个 token,直接跟服务器的 token 进行校验,如果不对或者超过有效期就失效。或者直接维护一个 session,直到回话结束。
    zjsxwc
        27
    zjsxwc  
       Jun 23, 2017 via Android
    当然是在 cookie 里存个 token,为了能自动登录,这个 token 比 session id 的寿命长,一般不会过期,然后服务端就是根据这 token 查询到用户咯
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5427 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 112ms · UTC 08:39 · PVG 16:39 · LAX 01:39 · JFK 04:39
    ♥ Do have faith in what you're doing.