【问题标题】:Understanding cross-domain user authentication了解跨域用户认证
【发布时间】:2011-06-25 00:57:07
【问题描述】:

目标:网站 1 通过 http 请求发送网站 2 用户数据。

问题:确保网站 2 的数据来自网站 1,而不是某些黑客。

注意:我不会使用 HTTPS,我知道这会解决一个大问题,但目前 GAE 不支持您自己的域名的 SSL:http://code.google.com/appengine/kb/general.html#httpsapps

所以我通过在两个站点之间加密和发送数据取得了很大进展,另一个站点能够解密和读取数据。我在 Google App Engine/Python/Django-nonreal 上,这个页面是让 pycrypto 工作的绝佳资源:http://code.activestate.com/recipes/576980/Kn

所以我很乐意知道用户数据是加密的,并且您需要有密钥才能读取它,但是 Website2 怎么知道请求来自 Website1?是什么阻止了黑客再次发送完全相同的请求,并且 Website2 认为该黑客可以在 Website2 上做事?

例如,难道不能有人只监听 http 请求并记录通过线路发送的加密数据吗?然后黑客可以使用与 Website1 之前使用的相同的值来执行自己的请求,并且黑客可以对 Website2 执行与 Website1 相同的操作吗?本质上,黑客会告诉 Website2 他们是 Website1 的有效登录用户。

总体目标:向网站 2 告知仅来自网站 1 请求的用户数据。除非您的网站 1,否则黑客使用与网站 1 发送到网站 2 相同的加密数据的任何其他请求都不会起作用。

不确定我是否解释得足够好,或者它是否只是我没有的非常基本的理解,但感谢您的帮助。

【问题讨论】:

    标签: authentication encryption encoding cross-domain http-authentication


    【解决方案1】:

    为了防止重放攻击,您需要包含随机数和 MAC(消息验证码)。

    MAC 可以简单地是加密消息内容的 HMAC-SHA1。接收方将计算相同的 MAC 并确保它匹配。 HMAC-SHA1 的密钥必须是双方都知道的秘密。这一步很重要——仅仅因为您的数据已加密并不意味着它不能被篡改。特别是,如果攻击者可以只改变随机数(见下),你就会遇到问题。所以使用合适的 MAC。

    nonce 应该在消息的加密部分内,并且只使用一次永远。接收端应记录该随机数并拒绝任何具有相同随机数的未来消息。这是防止重放攻击的关键。

    您还可以通过在 nonce 上附加到期日期来避免必须保留无限数量的 nonce。在过期日期之后收到的消息应被拒绝。可以在过期日期后从已看到的随机数数据库中删除随机数,加上几个小时以考虑可能的时钟差异,通过。

    正确生成随机数可能很棘手。这是一种技术:

    • 当您的应用服务器启动时,创建一个新的虚拟数据存储实体。缓存其密钥以及您的启动时间戳,直到您的应用服务器终止。同时创建一个初始化为 0 的计数器。
    • 当您需要随机数时,通过散列(实体键、启动时间戳、计数器)生成它。然后递增计数器。

    您可以在超过预期的最大时钟漂移经过的一段时间后删除虚拟数据存储实体。几个小时应该足够了。

    【讨论】:

      【解决方案2】:

      有多种方法可以做到这一点:

      使用随机数

      在加密消息中传递一个只能出现一次的值

      验证

      发送者创建一个令牌,它存储并与消息一起传递。收件人连接到所谓的发件人并要求验证。

      握手

      作为发送消息的一部分,发送者必须在通过身份验证之前使用质询-响应机制进行握手 - cookie 用于维护各个请求的状态

      还有更多..

      但如果这是用于身份验证,为什么不使用 OpenID?这已经解决了所有这些问题,并且几乎所有平台/框架都有现成的库。

      【讨论】:

        猜你喜欢
        • 2013-06-09
        • 2011-12-19
        • 2010-11-06
        • 2012-06-01
        • 2017-01-14
        • 2021-11-24
        相关资源
        最近更新 更多