Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.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
C# 如何在基于REST的服务中隐藏帐户信息?_C#_Android_Wcf_Web Services - Fatal编程技术网

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

C# 如何在基于REST的服务中隐藏帐户信息?,c#,android,wcf,web-services,C#,Android,Wcf,Web Services,我在使用REST服务访问数据库以登录用户时遇到了安全问题,我已经让它工作了,但我知道它不可能是这样的,因为密码没有以任何方式加密并通过URL传递。这是我的代码: 首先,发送请求的代码: private void validateUser(String user, String pass) { String URL = "http://myserviceserver/MyService.svc"; AlertDialog popup; try{ Htt

我在使用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);
}
现在,这就像一个符咒,但它是不安全的,因为它得到了,但我不太明白我如何才能隐藏发送的信息,因为现在我登录的请求只是在


感谢您的帮助:)

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


Amazon Web服务的工作方式就是一个很好的例子:

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


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

为什么不使用WCF中内置的函数进行身份验证?这样,您就不必重新实现整个HTTP客户机,只需使用WCF并将其配置为使用wsHttp。HMAC将被用来代替密码,而不是附加密码。hmac签名可以公开,因为一旦请求已经被处理(或者在稍后的日期,当时间戳是散列明文的一部分时),它们就没有任何用处了。如果您查看上面的实际方法签名,他正在使用用户名/密码创建帐户(
bool CreateNewAccount)(字符串用户、字符串通行证、字符串电子邮件);
)。HMAC不会给他那个,所以我的对冲。