了解跨域用户身份验证

时间:2011-02-10 17:33:48

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

目标:Website1通过http请求发送Website2用户数据。

问题:网站2确保数据来自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请求并记录加密数据通过线路发送的内容吗?然后黑客可以做出他们自己的请求,具有与之前使用的网站1相同的值,并且黑客可以对Website1可以执行相同的操作吗?基本上黑客会告诉Website2他们是Website1的有效登录用户。

总体目标:网站2被告知用户数​​据,这些数据仅来自Website1的请求。使用发送到Website2的相同加密数据Website1的黑客的任何其他请求将不起作用,除非您的Website1。

我不确定我是否解释得足够好,或者我是否已经非常基本的了解,但谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

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

使用随机数

  

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

<强>验证

  

发件人创建一个令牌,它与消息一起存储和传递。收件人与所谓的发件人联系并要求验证。

<强>握手

  

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

还有更多..

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

答案 1 :(得分:2)

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

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

nonce应位于邮件的加密部分内,并且只能使用 ever 。接收端应记录nonce并拒绝具有相同nonce的任何未来消息。这是防止重放攻击的关键。

通过将过期日期附加到随机数,您可以避免必须保留无限量的随机数。在过期日期之后收到的邮件应被拒绝。可以在到期日期之后从seen-nonce数据库中删除Nonce,再加上几个小时来计算可能的时钟差异,通过。

生成现时可能很难正确完成。这是一种技巧:

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

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