如何在基于REST的服务中隐藏帐户信息?

时间:2011-09-11 19:13:31

标签: c# android wcf web-services

我遇到安全问题使用REST服务来访问数据库以记录用户,我有它工作,但我知道它不能是这样的,因为密码不会以任何方式进行编程并通过URL。这是我的代码:

首先,发送请求的代码:

private void validateUser(String user, String pass)
{

    String URL = "http://myserviceserver/MyService.svc";

    AlertDialog popup;

    try{
        HttpGet request = new HttpGet(URL + "/Validate" + "/" + user + "/" + pass);

        request.setHeader("Accept", "application/json");
        request.setHeader("Content-type", "application/json");

        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpResponse response = httpClient.execute(request);

        HttpEntity responseEntity = response.getEntity();

        // Read response data into buffer
        char[] buffer = new char[(int)responseEntity.getContentLength()];
        InputStream stream = responseEntity.getContent();
        InputStreamReader reader = new InputStreamReader(stream);
        reader.read(buffer);
        stream.close();

        String resultado = new String(buffer);

        if(resultado.contains("true"))
        {
            popup = createAlertDialog("Message", "User Validated", "OK");
            popup.show();
        }
        else
        {
            popup = createAlertDialog("Message", "User NOT Validated", "OK");
            popup.show();
        }       


    }
    catch(Exception e)
    {

    }


}

现在,从服务器端,这是我的服务接口:

[ServiceContract]
public interface IMyService
{
    [OperationContract]
    [WebInvoke(Method = "GET", UriTemplate = "Create/{user}/{pass}/{email}")]
    bool CreateNewAccount(string user, string pass, string email);

    [OperationContract]
    [WebInvoke(Method = "GET", UriTemplate = "Validate/{user}/{pass}")]
    bool ValidateUser(string user, string pass);
}

现在,这就像一个魅力,但它是不安全的,但我不太明白我怎么能隐藏发送的信息,因为我现在只需在{{{ 3}}

任何帮助都会被贬低:)

2 个答案:

答案 0 :(得分:1)

一个开明的解决方案是使用HMAC授权。在此方案中,对REST api的每个请求都包含一个额外的头,其中包含请求本身的校验和,以及作为请求一部分的密码或其他一些预共享密钥。收到请求后,服务器将请求正文与其保存在其数据库中的密码连接起来,并验证校验和是否匹配。这意味着每个请求都是无状态的,即使请求以某种方式被嗅探,它也不会对攻击者有用,因为校验和仅对该特定请求有效。

这方面的一个很好的例子是亚马逊网络服务的运作方式:See here for a description

答案 1 :(得分:0)

如果您担心的是中间人攻击,我建议使用HTTPS:证书非常便宜,如果您使用HTTPS,大多数问题都会消失。

如果您担心泄漏服务器日志中的内容,那么,我会将参数作为请求参数而不是请求的一部分。看起来您实际上使用用户名/密码作为服务器方法的参数,因此HMAC不会完全帮助您。对于未使用传递的参数的请求,您可能希望切换到哈希认证方案。