有没有一种标准的方法来处理跨框架身份验证?

时间:2012-01-01 07:53:06

标签: ruby security node.js web

我有一些使用OpenID进行身份验证的Ruby Web应用程序,并将会话存储在cookie中。我的Ruby框架不太适合与API和AJAX相关的一些东西,所以我有一些node.js服务。问题是,如果有人知道我的AJAX服务的URL,他们基本上会对公众开放。目前,这些服务对Origin标题进行了简单的检查,但显然很容易伪造。

所以我希望能够限制对登录到运行的“主要”服务的用户访问在Node(或Python,或非基于Rack的Ruby服务或其他任何东西)上运行的服务的访问权限基于机架的Web应用程序。这种事情是如何完成的?我已经看到大量网站将通过example.com提供内容和页面,然后通过api.example.com进行AJAX调用,所以我很惊讶这是我没有读过的内容。

我确实知道如何做到这一点,而且我喜欢一些关于我是否遗漏一些令人目眩的明显不安全的反馈:

我的Ruby Web应用程序使用OpenID进行身份验证,并使用Rack::Session将会话存储在会话cookie中。从查看Rack::Session来源,我的框架似乎经历了这个过程:

  • 生成我的用户对象的Marshal转储
  • 根据密钥
  • 生成Marshal的SHA1哈希值
  • 在Cookie中存储SHA1哈希的十六进制摘要

因此理论上我可以使用预先安排的密钥或系统来生成密钥,或者通过安全通道在框架之间传递一些消息以共享密钥。然后,我可以在任何其他希望能够验证会话数据的框架中反转加密过程。当然,我必须摆脱第一步,只存储JSON数据或其他东西而不是Ruby对象以实现跨语言兼容性。

假设共享密钥的协议是否适当安全,这被认为是一种安全的做事方式吗?

1 个答案:

答案 0 :(得分:3)

您所描述的是消息验证码(MAC);在这种情况下,它是基于哈希的MAC或HMAC。基本上,表示要进行身份验证的数据(确保来自某个源),向其附加一个密钥,然后散列整个内容。然后将该计算的哈希附加到消息(您刚刚哈希的内容减去密钥)。当接收方收到消息时,它将获取数据,向其附加相同的共享密钥,并对其进行散列。如果该计算值与作为消息的一部分接收的值相同,则它是可信的并且应该被处理;如果哈希值不匹配,则不是来自该派对的派对,应该将其丢弃。

您可能需要查看指定HMAC构造的RFC(只是不要使用示例代码,因为它仍然使用MD5;使用SHA-256或SHA-512之类的东西来实现您的HMAC): http://www.ietf.org/rfc/rfc2104.txt