2

目标:Website1通过http请求发送Website2用户数据。了解跨域用户身份验证

问题:Website2确保数据来自Website1,而不是一些黑客。

注:我不会使用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相同的值,并且黑客可以对Website1执行与Website1相同的操作?本质上,黑客会告诉Website2他们是Website1的有效登录用户。

总体目标:Website2被告知用户数​​据,该数据仅来自Website1的请求。除非您的网站1使用相同的加密数据Website1发送到网站2,否则任何其他来自黑客的请求都将失效。

不知道我是否解释得不够好,或者是否有一个我基本没有的基本理解,但感谢您的帮助。

回答

2

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

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

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

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

生成随机数可能会很难做到正确。这里有一种技术:

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

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

2

这样做有多种方式:

使用随机数

传递加密信息的值只能出现一次

验证

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

握手

作为发送该消息的一部分,发送者具有使用质询 - 响应机制来认证之前做握手 - cookie用于跨越各个请求

保持状态

等等..

但是,如果这是验证,你为什么不使用OpenID的?这已经解决了所有这些问题,并且已经为几乎所有的平台/框架准备好了库。

+0

OpenID并没有解决重播攻击_at all_ ... – bdonlan 2011-02-11 17:27:14