2010-01-03 47 views
1

我在Rails中构建了一个基于XML的webservice作为iPhone应用程序的后端,我想知道如何才能最好地实现auth方案,这将允许我同时使用GET和POST请求 - 即不需要在XML有效负载的主体中发送auth的请求。Rails XML API设计实践

这里的皱纹是我没有使用普通的HTTP验证。相反,我正在创建一个SHA1摘要以及未经哈希的ID的硬件ID(连接w/a“秘密”字符串预摘要)。我在服务器上验证它,试图从请求中重新创建带有硬件ID的摘要,并将其与来自请求的散列硬件ID进行匹配。

我的问题是这样的:我应该创建我的服务,以便每个资源上的每个操作都需要包含常用XML结构中的安全上下文的POST XML的有效载荷,还是有更好的方法来实现它?

换句话说,我想使用GET对于像/显示,/指数等,但因为我的应用程序目前为,我不能这样做,因为我需要发送包含XML有效负载安全上下文。

也许有一种很好的方法可以有效地实现与Google API的头文件相同的功能?

每一个安全环境是这样的:

<request-wrapper> 
    <security-context> 
     <username>joefoo</username> 
     <hardware-id>AE7D128BCA9206E59901</hardware-id> 
     <hashed-hardware-id>cfd7983850301f97f6fdc26b553d1b6170f18bde</hashed-hardware-id> 
    </security-context> 
    ... 
    (remainder of request payload) 
    ... 
</request-wrapper> 

这是Rails的我的第一个XML服务,所以我会很感激在这方面的任何一般的做法的建议为好。

谢谢!

回答

3

你的认证方案受replay attacks如果“秘密字符串”停留在设备的寿命相同。

此外,可以通过strings(或其他工具)将“密钥”(如果它嵌入到您的应用程序中)彻底打破您的计划。

我会改为使用非对称密钥来设置一次性密钥,然后使用它来散列计数器或其他东西。如果您因某种原因需要硬件ID,请将其加上计数器。这基本上是一个虚拟的SSL实现,所以你可能会坦率地做到这一点(生成自己的证书,并进行罕见的相互身份验证;但仍然...)。

请记住,发明自己的安全方案几乎总是一个坏主意。

+0

感谢您的回应 - 这些都是好的。应用程序本身并不重要(没有个人数据或任何传输内容),如果这意味着简化实现,我一直认为重播风险是可以的,但是关于仅使用SSL的说法很重要。 – trevrosen

0

我想,这可能是最好简单地使用这个自定义标题,然后访问它们在我的控制器的过滤器瓦特/之类的东西:

request.headers['username'] 
request.headers['hardware-id'] 
request.headers['hashedhardware-id'] 

任何思考这是否是一个好/坏理念?

0

如何创建整个XML请求的SHA1摘要,而不仅仅是硬件ID?这样你就会使重播攻击变得更加困难。当然,如果没有时间戳和(可能)随机数来使每个请求都是唯一的,那么黑客仍然可以多次重复完全相同的请求(可能使用了帐户信用或任何其他信息),但至少他们无法从现有的请求,并改变请求的细节,使其做任何他们想要的。

建议步骤:

  • 把你的XML(没有任何散列硬件-ID),并把它变成一个字节数组。
  • 创建XML字节数组的SHA1摘要。
  • Base-64对XML字节数组和SHA1摘要字节数组(分开)进行编码。
  • 使用GET或POST发送base-64编码的XML作为一个请求参数,并将base-64编码的签名作为另一个发送。