我应该使用什么来保护REST Web服务中的参数

时间:2013-03-27 11:17:02

标签: android web-services security rest jersey

我想开发一个身份验证Web服务,可以在Android应用程序中用于登录并可以访问其他服务。所以基本上我会通过HTTP请求发送凭据,并在一切正常时授予用户访问权限。我需要保护这些凭据,以免被不需要的用户拦截。

我正在使用eclipse与Tomcat 7,Jersey进行休息的webservices,spring和hibernate。 我的网络服务就是这样的

@GET
@Path("/login/{id}/{pass}")
@Produces(MediaType.TEXT_HTML)
public String login(@PathParam("id") int id,@PathParam("pass") String pass) {
    String res="Null parameters";

    if(id!=0 && !pass.isEmpty())
    {
        try {
            User user = service.getOne(id);
            if(user.getPass().equals(pass))
                res="Success";
            else
                res="Fail";
        }
        catch (Exception e) {
            res="User not found";
        }
    }
    return "<html> " + "<title>" + "Result" + "</title>"
    + "<body><h1>" + res + "</body></h1>" + "</html> ";
}

我用它来测试浏览器,我还没有开始编写客户端代码。

我真的在这里摸不着头脑,我一直在网上看,有些人在谈论OAuth 2.0和其他关于HMAC的人,我不知道使用哪一个,如果还有另一种方法请让我知道。

如果您知道有关如何为我的项目实施安全性的有用教程,那将是非常好的,欢迎任何其他建议。非常感谢

3 个答案:

答案 0 :(得分:2)

这实际上取决于您的应用程序所需的安全级别。

有许多复杂的安全系统,但对于大多数应用程序来说,这些都是相当过分的。

如果您只是在寻找密码的基本保护,而不处理付款或真正敏感的数据,您可以执行以下简单操作。

  1. 如果可以,请将您的服务移至https工作。所有数据都将自动受到保护。

  2. 哈希密码。许多语言都已经为MD5和SHA1之类的简单散列提供了内置支持,如果不是你可以谷歌他们的实现,他们经常被使用。 这意味着即使您作为管理员也不知道真实密码。您只需在数据库中保存散列传递,并比较哈希值。

  3. 在您的客户端,为您的哈希添加一个盐。可能如果你谷歌第2步,这已经在那里,但否则它只是意味着你做像哈希(“132rjfASDF!”+密码“+ vnsadfr1!Z”);使它更随机。

  4. 这些简单的步骤可以非常轻松快速地完成,并且可以为您的服务提供大多数时间所需的所有安全性。 如果你真的在处理支付和敏感数据等事情,你应该研究更严肃的解决方案。

    PS。不要认为使用'post'而不是'get'是任何类型的安全性,从Android的角度来看,你使用它并不重要。无论如何,人们将不得不使用程序来获取网络连接以查看链接(按照示例WireShark),并且读取GET参数就像读取POST参数一样简单。

答案 1 :(得分:1)

上面的一些答案中存在一些混淆,实际上是问题本身。一些说明:

  • 首先,REST意味着无国籍。因此,你不应该有一个“登录”功能来设置某种服务器端标志,而是应该传递每个请求的凭据
  • 处理凭证应该在Jersey中使用过滤器而不是单独的资源方法。 Stack Overflow上有各种显示此内容的示例
  • 如果要在服务器上存储密码,请使用BCrypt对其进行哈希处理。 Bcrypt允许您拨出计算哈希值所需的时间,因此可以根据摩尔定律给出一些未来证据的度量
  • 您应该使用HTTPS进行所有通信。它为您提供了另一层安全和保护,便宜(编程 - 省力,无论如何)
  • 如果您想保护请求中的信息不被篡改,那么您应该查看Hawk之类的内容。这使您能够保护请求标头和正文免受篡改,并且还可以作为身份验证机制使用

正确保护您的REST端点还有很多其他方法,但如果按照上述步骤进行操作,您将会遇到重点。

答案 2 :(得分:0)

通常用户名和密码都是通过邮寄请求发送给用户的.​​.....这很好,有些人站在你的肩膀上,如果他们能看到网址,那么他们就可以看到你的用户名和密码......除此之外在服务器端使用SSL ..