最安全的方式来保护Jersey REST服务

时间:2011-06-30 21:31:36

标签: web-services http security jersey

我正在寻找真正的建议。我在亚马逊云实例上运行了一个系统,基本上是在JBoss上运行的一堆REST服务。我的下一步是保护这些服务,因为会有信用卡信息流过它们。我还需要身份验证,所以我的问题是,什么是可以用于REST服务的最安全的方法?

SSL CA当然,使用CA加密数据当然可能就是我开始的地方。 爸爸有信誉吗?或者我必须为verisign支付很多钱吗?

对于身份验证,仅仅执行基本身份验证还是仅仅让呼叫者以某种方式签署请求就足够了?还有其他方法吗?

OH我忘了提及,客户端应用程序是一个iPad应用程序。谢谢你的建议。

2 个答案:

答案 0 :(得分:2)

您希望能够在中间攻击中保护自己免受人员伤害,并防止重播请求。 每当有中继支付相关信息时,我都会选择使用现时和时间戳签署请求。 这涉及使用客户端和服务器之间的共享密钥签署请求。这个秘密可以在登录时传递一次。

使用时间戳和客户端生成的唯一nonce值作为签名字节的一部分。 这些值也作为请求中的标头传回,因此服务器可以重新组合请求。

curl执行的典型请求可能如下所示:

curl -v -H "Content-Type: application/json" -H "Authorization: ff7b93ad-27d0-49f6-90bd-9937951e5fcc:ncYoA5n5s2nFSm7qyvf5hDgL4pmmPOUP3zo/UYfaQKg=" -H "x-date:2013-03-28T19:34:00+00:00" -H "nonce:2d1321d32a" -X GET 'http://localhost/orders/123'

Authorization标头包含用于标识请求者的ID,然后是签名请求的哈希值。 日期标题应该在服务器时间的某个偏移量内(15分钟是合理的限制)。

我有一个完整的代码示例here

答案 1 :(得分:0)

使用证书是一个很好的安全开端。我发现Thawte在价值和支持客户之间取得了很好的平衡。当我看了一会儿(Go)时,GoDaddy并没有得到足够的客户支持(Java,Objective-C / iPad,浏览器),但现在可能已经改变了。您肯定希望确保您获得的证书得到您关心的客户的支持(在您的iPad情况下为Objective-C)。

基本身份验证可以通过https进行,只是确保您不会在URL中显示任何内容,例如ids或令牌,因为URL本身是可见的。如果您通过https发布所有数据,那么您将有一个良好的开端。