1

我想开发一个身份验证网络服务,可以在安卓应用程序中使用它来登录并访问其他服务。所以基本上我正在通过 HTTP 请求发送凭据,并在一切正常的情况下授予用户访问权限。我需要保护这些凭据,这样它们就不会被不受欢迎的用户截获。

我将 Eclipse 与 Tomcat 7、Jersey 一起用于我的其余 web 服务、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,我不知道该使用哪个,如果还有其他方法请告诉我.

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

4

3 回答 3

2

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

有很多复杂的安全系统,但对于大多数应用程序来说,这些都是多余的。

如果您只是在寻找一些基本的密码保护,而不处理付款或真正敏感的数据,您可以做以下简单的事情。

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

  2. 散列密码。许多语言已经内置了对简单散列的支持,例如 MD5 和 SHA1,如果没有,您可以谷歌它们的实现,它们经常被使用。这意味着即使您作为管理员也不知道真实密码。您只需将散列通行证保存在数据库中,然后比较散列。

  3. 在您的客户端,为您的散列添加盐。可能如果你用谷歌搜索第 2 步,这已经在里面了,否则它只是意味着你做了类似 hash("132rjfASDF!"+password"+vnsadfr1!Z"); 之类的事情。使其更加随机。

这些简单的步骤可以轻松快速地完成,并且会在大多数情况下为您的服务提供所需的所有安全性。如果您真的在处理诸如支付和敏感数据之类的事情,您应该寻找更严肃的解决方案。

附言。不要认为使用 'post' 而不是 'get' 是任何一种安全性,从 Android 的角度来看,使用哪种安全性并不重要。人们将不得不使用程序来获取网络连接以查看链接(例如 WireShark),并且读取 GET 参数与读取 POST 参数一样容易。

于 2013-03-27T11:28:25.140 回答
1

There's a fair bit of confusion in some of the above answers, and indeed the question itself. Some notes:

  • First off, REST is meant to be stateless. As such you should not have a 'login' function that sets some sort of server-side flag but instead should pass credentials with each and every request
  • Handling the credentials should be done in Jersey in a filter rather than in the individual resource methods. There are various examples on Stack Overflow that show this
  • If you are storing passwords on your server then use BCrypt to hash them. Bcrypt allows you to dial up the time taken to calculate a hash, so gives some measure of future-proofing against Moore's law
  • You should use HTTPS for all communications. It gives you another layer of security and protection for cheap (programming-effort-wise, anyway)
  • If you want to protect the information in your request against tampering then you should look at something like Hawk. This gives you the ability to protect your request headers and body against tampering, and can also work as an authentication mechanism as well

There is a lot more to securing your REST endpoints properly, but if you follow the above you'll have hit the major points.

于 2013-03-27T13:48:38.103 回答
0

通常用户名和密码是通过彻底的发布请求发送的,它对用户隐藏它。这很好,以防有人站在你的肩膀上,如果他们能看到 url,那么他们就可以看到你的用户名和密码……除了使用 SSL服务器端..

于 2013-03-27T11:22:19.733 回答