我正在Rails中构建一个基于XML的webservice作为iPhone应用程序的后端,我想知道如何才能最好地实现一种身份验证方案,让我同时使用GET和POST请求--即不需要在XML有效负载的主体中发送身份验证的请求。
这里的问题是我没有使用常规的HTTP身份验证。取而代之的是,我创建了iPhone硬件ID的SHA1摘要(连接了"secret“字符串预摘要)和未散列的ID,我在服务器上验证它,方法是尝试重新创建包含请求的硬件ID的摘要,并将其与请求的散列硬件ID进行匹配。
我的问题是:我应该创建我的服务,使每个资源上的每个操作都需要一个包含公共POSTed结构中安全上下文的XML有效负载,还是有更好的方法来做到这一点?
换句话说,我想对/show、/index等使用GET,但由于我的应用程序当前有效,我不能这样做,因为我需要发送一个包含安全上下文的XML有效负载。
也许有一个很好的方法可以像Google的web 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服务,因此我也非常感谢在这方面的任何一般实践建议。
谢谢!
发布于 2010-01-04 05:31:20
如果“秘密字符串”在设备的整个生命周期内保持不变,则您的身份验证方案受replay attacks的约束。
此外,“密钥”(如果它嵌入到您的应用程序中)可以通过strings (或其他工具)完全破坏您的方案。
相反,我会使用非对称密钥来设置一次性密钥,然后使用它来散列计数器或其他东西。如果您出于某种原因需要硬件id,请将其与计数器一起散列。这基本上是一个愚蠢的SSL实现,所以您不妨坦率地这样做(生成您自己的证书,并执行罕见的相互身份验证;但仍然...)。
记住,发明自己的安全方案几乎总是一个坏主意。
发布于 2010-01-04 05:18:29
我在想,最好的办法就是简单地使用自定义头部,然后在我的控制器过滤器中访问它们,如下所示:
request.headers['username']
request.headers['hardware-id']
request.headers['hashedhardware-id']对于这是个好主意还是坏主意,有什么想法吗?
发布于 2010-06-30 22:40:18
如何创建整个SHA1请求的XML摘要,而不仅仅是硬件id?这样做会使重放攻击变得更加困难。当然,如果没有时间戳和(可能)使每个请求唯一的nonce,黑客仍然可以多次重播完全相同的请求(可能会用完账户积分或其他任何东西),但至少他们不能从现有请求中提取摘要并更改请求细节,让它做任何他们想做的事情。
建议的步骤:
https://stackoverflow.com/questions/1996301
复制相似问题