2011-09-08 8 views
0

私のゲームアプリでは、iPhone/iPadからTCPを介して制御するセントラルサーバにログインしてログイン情報を送信する必要があります。TCP経由でパスワードを暗号化する方法は?

私が現在行っていることは、ログイン用のASCIIバイトとパスワードでクリアされたLOGINオペコードを送信することです。私はユーザーのパスワードを明確に送信したくありません。たとえば、Wi-Fi接続の場合があります。

この暗号化はどのように処理できますか?ここに私の要件は次のとおりです。

  • 私はは絶対に必要な場合、私は意志、は、サードパーティ製のlibが使用する必要はありません。必要であれば、それは私がこのアプリはすべての国で利用できるようにしたい私の影響は、アプリケーションストア
    • に「あなたのアプリケーションは、それに暗号を持っていない」に「はい」と答えています何BSDライセンスまたは類似
    • なければなりません
  • デバイス上でローカルにパスワードをハッシュし、そのキャッシュされた値のみを送信することはできますか?ハッシュが盗まれた場合、ユーザーのアカウントが侵害される可能性がありますが、パスワードが失われることはありません(パスワードは保存されません)。
  • OAuthのアウトオブザ私が以前経験したようにセットアップされたシステムは、あまりにも侵襲的です。

私はここで敗北しています。これは、開発のほぼ1年を終える前に私が取り組む必要がある最後の3つの事柄の1つであるので、私はここで良い助けを感謝します。(これは理論的でも時期尚早の最適化でもありません!

+0

は、あなたが[RSA](http://en.wikipedia.org/wiki/RSA)のような公開鍵暗号の型に見たことがありますか?または、クライアントにマスターキーを保存しておくのが快適な場合は、[AES](http://en.wikipedia.org/wiki/Advanced_Encryption_Standard)はどうですか?あらかじめ構築されたライブラリは存在しますが、これらのメソッドは自分で実装することができます。その仕様はパブリックドメインです。 – ShaneC

+0

セキュリティ保護されたトランスポート層であるかどうかにかかわらず、クリアテキストのパスワードを保存する必要はありません。何か読んでください。 :) – bzlm

答えて

4

最初に、義務付けられている:「あなたの専門家でなければ、それは間違っているでしょう。あなたが専門家であれば、それは間違ったひどく壊れていますが、あなたのスキームが数千人で使用されるまで、どんな壊れ目が見えなくなるでしょうか?」

次に、あなたが何を保護したいのか、なぜそうであるのかを明確にしてください。あなたは何らかの理由でプレーンテキストのユーザーパスワードが悪いと言います。多数の場所でユーザーが使用しているパスワードがアプリケーションによって漏洩したり、ユーザーの他のアカウントを侵害したり、攻撃者がユーザーのアカウントにアクセスできるようになることを懸念していますか?

私があなたのハッシュアイデアのサブテキストで読んだことは、クライアントが送信するハッシュが決して変更されないことです(パスワードが変更されない限り)。これにより、認証の平文に相当します(攻撃者はハッシュを盗むだけで、パスワードを知らなくても認証できます)。また、パスワードを、ハッシュを見ることができる誰かによるブルートフォース攻撃に対して、より脆弱にします。

アプリケーションの可用性を制限する懸念があるため、暗号化を避けたいという印象を受けます。私はその理由を理解することができます。

暗号で保護されたハッシュは暗号化ではないとします(それがあるかどうかわかりませんが、私が読んだ限り、米国の輸出制限の点ではありません)。私の提案は、ユーザーがパスワードを持っていることを確認するための非常にシンプルなチャレンジ/レスポンスプロトコルです(私はあなたが「チャレンジレスポンスプロトコル」をオンラインで検索することをお勧めします)。

ここで注意しなければならないのは、最初にサーバーへのパスワードの取得に対処していないことです。ユーザーがアカウントの正しいパスワードを持っていることをサーバーが確認するだけです。あなたはリプレイ攻撃のようなものを防ぎ、データ・ストリームを見ることができ、攻撃者の生活をより困難にするかもしれない方法の一般的な考え方と考える:

クライアント:「私はジョン・スミスとして認証したい」

にサーバー: "Okay 'John Smith'-claiming-person、現在の日付と時刻(2011-09-09 @ 12:04:33AM)と私が思った乱数(4bazillion)を取り、パスワードでハッシュします。あなたが持っているものを教えてください。

クライアント:

  • は、パスワードの入力をユーザーに求め
  • ハッシュ
  • は言う: "私が得た:。gaAGRtcq4qt22332"

サーバー:

  • は言う::

    • が一致した場合、計算データ
    • でクライアントからのデータを比較し、日付と時刻と乱数を取り、パスワード
    • でハッシュ"さて、あなたは入っています。"それ以外の場合は
    • は言う: "ポンドの砂を移動します。"
+1

あなたの最初の段落に関連するこれのバージョン:[SRP](http://en.wikipedia.org/wiki/Secure_remote_password_protocol) –

+0

こんにちは、良いコメントとありがとう!私は実際にあなたが記述する方法を考え、リプレイ攻撃の問題を理解しています。実際、私はこれを私のプロトコルの別の部分に使用しています。しかし、私は本当にしたくないことをしないで、まずサーバーにパスワードを取得する方法は見当たりません。 - 私がここで行うことができる最も良いことは、アカウント作成時に側でいくつかのhttpsを開くことです。パスワードでアカウントを作成し、私のプロトコルでログインしてください。それを解決するが、一種の気分だ – Nektarios

2

TLS/SSLちょうどそれを使用します。これはiOSに組み込まれています。

暗号化については、暗号化を使用すると主張する必要があります。暗号化を使用すると、政府から(簡単な)オンライン登録証明書を取得する必要があります。

+0

iOSではないのは明らかです(FreeBSDです).iOS上のAPIは何を使うべきか、そして私はサーバ上でどのライブラリを使うべきですか?コンセプトは何ですか?サーバはすべての接続に対して証明書を生成します? – Nektarios

+0

生のライブラリ:OpenSSL、PolarSSL、などPre-canned:Apache with mod_ssl –

+0

iOSに組み込まれているTLSライブラリのみを使用する場合は、暗号化を使用する必要がありますか? –

2

HTTPSでサービスを認証します。サードパーティライブラリを使用する必要はありません。あなたはポストかゲットのどちらかとして実装することができます。

関連する問題