Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 我应该使用什么来保护REST Web服务中的参数_Android_Web Services_Security_Rest_Jersey - Fatal编程技术网

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

Android 我应该使用什么来保护REST Web服务中的参数,android,web-services,security,rest,jersey,Android,Web Services,Security,Rest,Jersey,我想开发一个身份验证web服务,它可以在android应用程序中用于登录和访问其他服务。因此,基本上我通过HTTP请求发送凭据,并在一切正常的情况下授予用户访问权限。我需要保护这些凭据,以便它们不会被不需要的用户拦截 我将eclipse与Tomcat7一起使用,Jersey用于我的rest Web服务,spring和hibernate。 我的网络服务是这样的 @GET @Path("/login/{id}/{pass}") @Produces(MediaType.TEXT_HTML) publi

我想开发一个身份验证web服务,它可以在android应用程序中用于登录和访问其他服务。因此,基本上我通过HTTP请求发送凭据,并在一切正常的情况下授予用户访问权限。我需要保护这些凭据,以便它们不会被不需要的用户拦截

我将eclipse与Tomcat7一起使用,Jersey用于我的rest 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> ";
}
@GET
@路径(“/login/{id}/{pass}”)
@生成(MediaType.TEXT\u HTML)
公共字符串登录(@PathParam(“id”)int-id、@PathParam(“pass”)字符串pass){
String res=“空参数”;
如果(id!=0&&!pass.isEmpty())
{
试一试{
User=service.getOne(id);
if(user.getPass().equals(pass))
res=“成功”;
其他的
res=“失败”;
}
捕获(例外e){
res=“未找到用户”;
}
}
返回“+”+“结果”+“
+“+res+”+“+”;
}
我正在用它来测试浏览器,我还没有开始编写客户端代码

我真的很抓狂,我一直在网上浏览,一些人在谈论OAuth 2.0,另一些人在谈论HMAC,我不知道该用哪一种,如果有其他方法,请告诉我


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

通常通过post请求发送用户名和密码,这会对用户隐藏用户名和密码。。如果有人站在你身后,如果他们能看到url,那么他们就能看到你的用户名和密码,这很好。。。除此之外,请在服务器端使用SSL

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

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

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

  • 如果可以,请通过https将服务移动到工作状态。所有数据都将自动受到保护

  • 散列密码。很多语言已经内置了对简单散列的支持,比如MD5和SHA1,如果你不能用谷歌搜索它们的实现,它们经常被使用。 这意味着即使你是管理员也不知道真正的密码。您只需将散列过程保存在数据库中,然后比较散列

  • 在客户端,向散列添加盐。如果你用谷歌搜索第二步,它可能已经在那里了,但否则它只意味着你要做一些类似散列的事情(“132rjfASDF!”+密码“+vnsadfr1!Z”);让它变得更加随机

  • 这些简单的步骤可以非常容易和快速地实现,并将在大多数情况下为您的服务提供所需的所有安全性。 如果你真的在处理诸如支付和敏感数据之类的事情,你应该研究更严肃的解决方案


    另外,不要认为使用“post”而不是“get”是一种安全措施,从安卓的角度来看,使用哪种安全措施并不重要。人们无论如何都必须使用一个程序来获取网络连接,才能看到链接(根据WireShark的例子),而且读取GET参数和读取POST参数一样简单

    上面的一些答案,甚至问题本身,都有点混乱。一些注意事项:

    • 首先,REST是无状态的。因此,您不应该具有设置某种服务器端标志的“登录”功能,而应该在每个请求中传递凭据
    • 应该在筛选器中而不是在单个资源方法中处理凭据。有很多关于堆栈溢出的例子说明了这一点
    • 如果要在服务器上存储密码,请使用BCrypt对其进行散列。Bcrypt允许您拨出计算散列所需的时间,因此提供了一些针对摩尔定律的未来证明措施
    • 所有通信都应使用HTTPS。它为您提供了另一层安全性和保护,而且成本低廉(无论如何,编程工作是明智的)
    • 如果您想保护请求中的信息不被篡改,那么您应该查看以下内容。这使您能够保护请求头和主体免受篡改,还可以作为身份验证机制

    要正确保护REST端点,还有很多方法,但如果您遵循上述方法,您将抓住要点。

    是的,我知道GET方法不正确,POST方法更好,因为它隐藏了参数。但我需要加密发送这些参数,SSL够了吗?我认为哈希对我的应用程序来说就足够了,我不需要FBI那样的保护,这是关于办公室订单(邮件服务)的。我会查的。谢谢你是的,就像我大多数时候说的,这就足够了。互联网上有很多针对Android/Java md5/sha1哈希的复制粘贴解决方案。祝你好运:)