Database 发布服务器未存储的用户会话密钥是否可以被视为安全的?

Database 发布服务器未存储的用户会话密钥是否可以被视为安全的?,database,security,session,client-server,distributed,Database,Security,Session,Client Server,Distributed,而不是服务器向客户机发出随机生成的会话字符串作为服务访问密钥(也称为“身份验证令牌”),将其插入数据库以维护一组用户密钥关系,以便在每个服务请求上进行后续验证,服务器是否可以不执行以下操作以在这样的分布式系统中实现类似或更好的安全性: 获取用户的主键(也称为“用户标识符”) 获取选定的密钥过期时间戳,以及(可选)客户端的IP地址,以及任何值得嵌入密钥的内容 将一个秘密字符串作为密钥验证签名 序列化以上所有内容 使用服务器只知道的密钥对称地加密结果,或使用服务器选择的私钥不对称地加密结果 然后,作

而不是服务器向客户机发出随机生成的会话字符串作为服务访问密钥(也称为“身份验证令牌”),将其插入数据库以维护一组用户密钥关系,以便在每个服务请求上进行后续验证,服务器是否可以不执行以下操作以在这样的分布式系统中实现类似或更好的安全性:

  • 获取用户的主键(也称为“用户标识符”)
  • 获取选定的密钥过期时间戳,以及(可选)客户端的IP地址,以及任何值得嵌入密钥的内容
  • 将一个秘密字符串作为密钥验证签名
  • 序列化以上所有内容
  • 使用服务器只知道的密钥对称地加密结果,或使用服务器选择的私钥不对称地加密结果
  • 然后,作为上述步骤结果的会话密钥将与客户端共享,例如与cookie共享。对于像HTTP这样的无状态协议,每个请求都必须使用会话密钥证明客户端身份验证,上述过程由服务器反向完成,目的是恢复经过身份验证的用户标识符

    在其他条件相同的情况下,攻击者需要成功攻击底层加密技术才能伪造会话密钥,从而危及该系统的安全性。在“everything Other”一词中,我指的是一些弱点,比如对手从客户端获取用户的会话密钥,并打算自己使用它

    我认为这种方法的优点是:

  • 无需在任何地方维护有效的用户密钥关系集
  • 每个密钥中嵌入的过期值确保任何人在超过某个时间点后都不能使用密钥
  • 服务器基于解密的验证可能比数据库访问成本更低
  • 缺点可能是:

  • 服务器使密钥无效可能被认为是有问题的:
    • 即使密钥安全地嵌入(例如IP地址),其中服务器可以通过将嵌入地址与服务请求后面的地址进行比较来使用IP地址验证密钥,IP地址也可能被伪造
    • 如果通过服务器维护一组被撤销的密钥来解决密钥撤销问题,人们可能会问,这比首先维护一组用户密钥关系好多少

  • 我认为这个问题是封闭的,因为它可能从来没有一个单一的可接受的答案,因此不适合这样的指导方针,但由于它一直保持开放,并得到了有用的答案,我不会删除它,至少。< / P> < P>我喜欢这个方法,我用它来为我的网站,因为它很容易与它缩放。 我在HTTP上看到的这个协议的唯一安全问题是,您的请求容易受到重播攻击/嗅探。顺便说一下,存储在非加密传输协议上的cookie中的会话ID也存在同样的问题,除非您在每个请求上重新生成会话ID


    额外阅读:wich包含一个链接,指向一篇关于这个主题的优秀论文(很抱歉,我现在不能在stackoverflow上发布多个链接;)。

    您想用什么来加密/解密数据

    一般来说,我不建议你按照上面所说的去做,因为:

    • 为什么不将所有会话都放在一个集中的存储中?您的加密算法也可能被盗/被破解
    • 数据库访问很可能会更快、更容易管理/编码
    如果您的源代码被盗或算法被破坏,攻击者可以创建新的自定义会话,并使自己成为管理员-您可以自己镜像其余的会话


    您考虑过在PHP中使用标准会话库吗?

    系统的缺点是“登录”令牌在cookie中以明文形式发送,无论令牌是否在数据库中,这都是相同的缺点,并通过使用HTTPS连接加以防范

    话虽如此,大多数网站不使用HTTPS。他们做出了权衡。如果您不使用HTTPS,并且希望将发送经过身份验证的cookie与发送cookie作为数据库密钥进行比较,则前者与后者相比没有任何区别

    最好还包括请求的IP地址以及到期日期

    但是,没有必要将加密的令牌存储在cookie中-发送纯文本凭据,然后发送凭据和秘密的加密安全散列,同样安全,而且更安全。有关详细信息,请参见。HMAC基本上是:

    假设变量username、expires、ip_地址和a(一个随机数)已经存储在cookie中;您可以提取它们,以及cookie中的哈希值。在脚本中,您有一个额外的“密码”,它永远不会直接存储在cookie中:

    hash = hash_hmac("sha256",username+expires+ip_address+salt,"password")
    
    此哈希的安全性基于。这应该是一些随机的数字、字母和标点符号字符串,长度至少为20个字符,存储在服务器端脚本中

    如果cookie中的散列是正确的,您可以确定被散列的字段没有被篡改!攻击者产生有意义的碰撞的可能性是数百万比一[1]——肯定超过了宇宙中所有计算机的计算能力和数百万年的时间。如果你的密码是随机的,那么它就是安全的

    但是整个系统对于一个有决心的攻击者来说只是一个减速器,并且只适用于正常的网站,而不适用于包括支付或用户安全期望在内的事情。没有HTTPS,系统就不安全,而使用HTTPS,则不需要对cookie进行身份验证

    确定的攻击者可以访问您的站点以恢复密码-没有任何东西可以阻止他们恢复日志