2011-09-11 4 views
0

REST 서비스를 사용하여 데이터베이스에 액세스하여 사용자를 로그인하는 보안 문제가 있습니다. 작동하지만 암호가 어떤 방식 으로든 암호화되지 않고 URL을 통해 이동하기 때문에 그렇게 될 수 없습니다. .REST 기반 서비스에서 계정 정보를 숨기려면 어떻게합니까?

첫째, 요청 전송 코드 : : 이것은 내 코드 지금

[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); 
} 

는이 같은 작품 : 서버 측에서 지금

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) 
    { 

    } 


} 

을,이 내 서비스 인터페이스입니다 하지만 매력적이지는 않지만 안전하지는 않지만 보내는 정보를 숨길 수있는 방법은 아직 이해가되지 않습니다. 바로 지금은 http://myserviceserver/MyService.svc/Validate/user/password에 요청하여 로그인하고 있기 때문입니다.

은 어떤 도움이 apreciated됩니다 :)

+0

인증을 위해 WCF에 내장 된 기능을 사용하지 않는 이유는 무엇입니까? 그렇게하면 헤더와 물건으로 전체 HTTP 클라이언트를 재 구현할 필요가 없으며 WCF를 사용하고 wsHttp를 사용하도록 구성하면됩니다. – CodeCaster

답변

0

당신이 걱정하는 것은 중간자 공격, 내가 HTTPS를 권하고 싶습니다 경우 : 인증서 표시 꽤 저렴하고 HTTPS를 사용하면 대부분의 문제가 사라집니다.

서버 로그에 누출 물이 누출 될까봐 걱정된다면 요청의 일부가 아닌 요청 매개 변수로 인수를 넣을 것입니다. 실제로 사용자 이름/암호를 서버 메서드에 대한 인수로 사용하고있는 것처럼 보입니다. 따라서 HMAC가 전적으로 사용자를 도와주지는 않습니다. 전달 된 매개 변수를 사용하지 않는 요청의 경우 해시 인증 스키마로 전환 할 수 있습니다.

+0

HMAC는 암호 대신에 사용되며, 이외에는 사용되지 않습니다. hmac 서명은 요청이 이미 처리 된 후에는 사용할 수 없으므로 공개 할 수 있습니다. (또는 나중에, 타임 스탬프가 해시 된 일반 텍스트의 일부일 때) – SingleNegationElimination

+0

위의 실제 메소드 서명을 보면 계정을 만들기위한 사용자 이름/비밀번호 ('bool CreateNewAccount (string user, string pass, string email);). HMAC은 그를 포기하지 않을 것이고, 그러므로 내 헤징을 할 것이다. – Femi

1

한 계몽 솔루션은 HMAC 인증을 사용하는 것입니다. 이 스키마에서 REST API에 대한 모든 요청에는 요청의 일부인 암호 또는 다른 사전 공유 키와 함께 요청 자체에 대한 체크섬이 포함 된 추가 헤더가 포함됩니다. 서버는 요청을 받으면 요청 본문을 데이터베이스에 보관 된 암호와 연결하여 체크섬이 일치하는지 확인합니다. 즉, 각 요청에 상태가 없으며 요청이 어떻게 든 스니핑 되더라도 체크섬은 특정 요청에 대해서만 유효하기 때문에 공격자에게는 유용하지 않습니다.

이것의 좋은 예는 아마존 웹 서비스의 작동 방식입니다 : See here for a description

관련 문제