1

Androidアプリでログインして他のサービスにアクセスできる認証Webサービスを開発したいと思います。つまり、基本的には、HTTPリクエストを介してクレデンシャルを送信し、すべてが正常であればユーザーにアクセスを許可します。不要なユーザーに傍受されないように、これらの資格情報を保護する必要があります。

残りのWebサービス、SpringおよびHibernateには、Tomcat 7、JerseyでEclipseを使用しています。私のWebサービスは次のようになります

@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> ";
}

私はそれをブラウザでテストするために使用していますが、まだクライアントのコーディングを開始していません。

私はここで本当に頭を悩ませています、私はウェブを見回しています、いくつかはOAuth 2.0について話し、他はHMACについて話します、そして私はどちらを使うべきかわかりません、そして他の方法があるなら私に知らせてください。

私のプロジェクトにセキュリティを実装する方法についての役立つチュートリアルを知っているなら、それは素晴らしいことですが、他の提案は大歓迎です。どうもありがとう

4

3 に答える 3

2

それは本当にあなたがあなたのアプリケーションのために必要とするセキュリティのレベルに依存します。

複雑なセキュリティシステムはたくさんありますが、ほとんどのアプリケーションにとって、これらはかなりやり過ぎです。

支払いや本当に機密性の高いデータを処理せずに、パスワードの基本的な保護を単に探している場合は、次の簡単なことを行うことができます。

  1. 可能であれば、httpsを介して機能するようにサービスを移動します。すべてのデータは、すでにそれによって自動的に保護されます。

  2. パスワードをハッシュします。多くの言語には、MD5やSHA1などの単純なハッシュの組み込みサポートがすでに組み込まれていますが、それらの実装をグーグルで検索できない場合は、それらがよく使用されます。これは、管理者であるあなたでさえ実際のパスワードを知らないことを意味します。ハッシュされたパスをデータベースに保存し、ハッシュを比較するだけです。

  3. クライアント側で、ハッシュにソルトを追加します。おそらく、ステップ2をグーグルで検索すると、これはすでにそこにありますが、それ以外の場合は、hash( "132rjfASDF!" + password "+ vnsadfr1!Z");のようなことを行うことを意味します。それをさらにランダムにするために。

これらの簡単な手順は非常に簡単かつ迅速に実行でき、ほとんどの場合に必要なすべてのセキュリティをサービスに提供します。支払いや機密データなどを実際に扱っている場合は、より深刻な解決策を検討する必要があります。

ps。「get」の代わりに「post」を使用することはいかなる種類のセキュリティでもあるとは思わないでください。Androidの観点からは、これにどちらを使用するかは実際には問題ではありません。とにかくネットワーク接続をフェッチするプログラムを使用して、リンクが来ることを確認する必要があります(たとえば、WireShark)。その点で、GETパラメーターの読み取りはPOSTパラメーターの読み取りと同じくらい簡単です。

于 2013-03-27T11:28:25.140 に答える
1

上記の回答のいくつか、そして実際に質問自体にはかなりの混乱があります。いくつかのメモ:

  • まず、RESTはステートレスであることが意図されています。そのため、ある種のサーバー側フラグを設定する「ログイン」関数は必要ありませんが、代わりにすべてのリクエストで資格情報を渡す必要があります
  • クレデンシャルの処理は、個々のリソースメソッドではなく、フィルターでジャージーで実行する必要があります。これを示すStackOverflowのさまざまな例があります
  • サーバーにパスワードを保存している場合は、BCryptを使用してパスワードをハッシュします。Bcryptを使用すると、ハッシュの計算にかかる時間をダイヤルアップできるため、ムーアの法則に対する将来性をある程度保証できます。
  • すべての通信にHTTPSを使用する必要があります。それはあなたに安価なセキュリティと保護の別の層を提供します(とにかくプログラミング-努力的に)
  • リクエスト内の情報を改ざんから保護したい場合は、Hawkのようなものを検討する必要があります。これにより、リクエストヘッダーと本文を改ざんから保護することができ、認証メカニズムとしても機能します。

RESTエンドポイントを適切に保護する方法は他にもたくさんありますが、上記に従うと、重要なポイントに到達することになります。

于 2013-03-27T13:48:38.103 に答える
0

通常、ユーザー名とパスワードは、ユーザーからそれを隠す完全な投稿リクエストで送信されます。これは、誰かがあなたの肩越しに立っていて、URLを見ることができれば、あなたのユーザー名とパスワードを見ることができる場合に適しています...それ以外はSSLを使用しますサーバ側..

于 2013-03-27T11:22:19.733 に答える