2011-09-11 11 views
0

RESTサービスを使用してデータベースにアクセスしてユーザーをログインさせるセキュリティ上の問題がありますが、動作していますが、パスワードが何らかの形で暗号化されていないため、 。これは私のコードです:RESTベースのサービスでアカウント情報を非表示にするにはどうすればよいですか?

まず、要求を送信するコード:

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

、これはのように動作します魅力はありますが、それが得られるほど安全ではありませんが、今は単にhttp://myserviceserver/MyService.svc/Validate/user/passwordにリクエストしてログインしているので、送信された情報をどのように隠すことができるのか分かりません。

すべてのヘルプはapreciatedされます:)

+0

認証用にWCFに組み込まれている機能を使用しないのはなぜですか?そうすれば、ヘッダーやものでHTTPクライアント全体を再実装する必要はなく、WCFを使用してwsHttpを使用するように構成するだけです。 – CodeCaster

答えて

0

何を心配していることはman-in-the-middle攻撃であれば、私はHTTPSをお勧めします:本命はかなり安価であり、 HTTPSを使用すると、ほとんどの問題は解消されます。

サーバログに漏れがあると心配しているのであれば、リクエストの一部ではなくリクエストパラメータとして引数を渡しています。あなたが実際にあなたのサーバーメソッドへの引数としてユーザー名/パスワードを使用しているように見えるので、HMACはあなたを完全には助けません。渡されたパラメータを使用していないリクエストに対しては、ハッシュ認証スキームに切り替えることができます。

+0

パスワードの代わりにHMACが使用されます。 hmacの署名は、要求がすでに処理された後で使用できないので公開することができます(または後日、タイムスタンプがハッシュされた平文の一部である場合) – SingleNegationElimination

+0

彼が実際に使用している署名を見ればアカウントを作成するためのユーザ名/パスワード( 'bool CreateNewAccount(文字列ユーザ、文字列パス、文字列メール)')。 HMACは彼にそれを与えません、それゆえ私のヘッジ。 – Femi

1

1啓発ソリューションは、HMAC認証を使用することです。このスキームでは、REST APIへのすべてのリクエストに、リクエストの一部としてのパスワードやその他の事前共有キーを含むリクエスト自体のチェックサムを含む余分なヘッダーが含まれています。要求を受け取ると、サーバーは要求本体をデータベースに保持されているパスワードと連結し、チェックサムが一致していることを確認します。これは、各リクエストがステートレスであることを意味します。リクエストが何らかの形でスニッフィングされても、チェックサムはその特定のリクエストに対してのみ有効なので、攻撃者にとって有用ではありません。

本の偉大な例では、Amazon Webサービスが動作する方法である:See here for a description

関連する問題