首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails XML API设计实践

Rails XML API设计实践
EN

Stack Overflow用户
提问于 2010-01-04 05:03:47
回答 3查看 907关注 0票数 1

我正在Rails中构建一个基于XML的webservice作为iPhone应用程序的后端,我想知道如何才能最好地实现一种身份验证方案,让我同时使用GET和POST请求--即不需要在XML有效负载的主体中发送身份验证的请求。

这里的问题是我没有使用常规的HTTP身份验证。取而代之的是,我创建了iPhone硬件ID的SHA1摘要(连接了"secret“字符串预摘要)和未散列的ID,我在服务器上验证它,方法是尝试重新创建包含请求的硬件ID的摘要,并将其与请求的散列硬件ID进行匹配。

我的问题是:我应该创建我的服务,使每个资源上的每个操作都需要一个包含公共POSTed结构中安全上下文的XML有效负载,还是有更好的方法来做到这一点?

换句话说,我想对/show、/index等使用GET,但由于我的应用程序当前有效,我不能这样做,因为我需要发送一个包含安全上下文的XML有效负载。

也许有一个很好的方法可以像Google的web API一样有效地实现同样的事情?

每个安全上下文看起来都是这样的:

代码语言:javascript
复制
<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服务,因此我也非常感谢在这方面的任何一般实践建议。

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-01-04 05:31:20

如果“秘密字符串”在设备的整个生命周期内保持不变,则您的身份验证方案受replay attacks的约束。

此外,“密钥”(如果它嵌入到您的应用程序中)可以通过strings (或其他工具)完全破坏您的方案。

相反,我会使用非对称密钥来设置一次性密钥,然后使用它来散列计数器或其他东西。如果您出于某种原因需要硬件id,请将其与计数器一起散列。这基本上是一个愚蠢的SSL实现,所以您不妨坦率地这样做(生成您自己的证书,并执行罕见的相互身份验证;但仍然...)。

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

票数 3
EN

Stack Overflow用户

发布于 2010-01-04 05:18:29

我在想,最好的办法就是简单地使用自定义头部,然后在我的控制器过滤器中访问它们,如下所示:

代码语言:javascript
复制
request.headers['username']
request.headers['hardware-id']
request.headers['hashedhardware-id']

对于这是个好主意还是坏主意,有什么想法吗?

票数 0
EN

Stack Overflow用户

发布于 2010-06-30 22:40:18

如何创建整个SHA1请求的XML摘要,而不仅仅是硬件id?这样做会使重放攻击变得更加困难。当然,如果没有时间戳和(可能)使每个请求唯一的nonce,黑客仍然可以多次重播完全相同的请求(可能会用完账户积分或其他任何东西),但至少他们不能从现有请求中提取摘要并更改请求细节,让它做任何他们想做的事情。

建议的步骤:

  • 将XML (不包含任何散列硬件id)转换为字节数组。
  • 创建XML字节数组的SHA1摘要。
  • base-64将XML字节数组和SHA1摘要字节数组编码为一个请求参数,并将base-64编码的签名作为另一个请求参数,使用GET或POST。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1996301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档