web-dev-qa-db-ja.com

iOSアプリ-アプリ内またはサーバー上でユーザーパスワードをハッシュしますか?

私は、Webコンポーネントも持つiOSアプリに取り組んでいます。ユーザーがアカウントを作成すると、そのパスワードはソルトおよびハッシュされます。私はすでにハッシュアルゴリズムをWeb側で機能させています。

新しいユーザーがアプリでアカウントを作成するとき、iOSアプリは自分のパスワードをハッシュし、それをサーバーに送信してデータベースに直接挿入する必要がありますか?または、パスワードをプレーンテキストでサーバーに送信し、そこでハッシュ化する必要がありますか?アプリ内で暗号化し、サーバーに送信し、復号化してからハッシュ化する必要がありますか?最善かつ最も安全なプロトコルが何であるか私にはわかりません。ログインしようとしている既存のユーザーを認証する場合も、同じ質問が当てはまると思います。

また、現時点ではサーバーにSSLを設定していませんが、これが役立つ場合は、それを実行してもかまいません。

9
Mike

SSLを使用してインターネット上の通信を安全に処理し、サーバーでパスワードをハッシュ化します。それ以外の場合、サービスに関する限り、パスワードハッシュは単にパスワードになり、データベースにアクセスする攻撃者は、パスワードがプレーンテキストで保存されているかのように、任意のユーザーとしてログインできます。 SSLは、ユーザーの資格情報がネットワーク上で傍受されるのを防ぐために不可欠です。

7
Polynomial

なぜ両方できないのですか?ユーザーがパスワードを入力すると(新しいユーザーとして、またはログイン中に)、クライアント側でハッシュし、安全なチャネルを介してサーバーに送信します。これにより、比較を行う前に再度ハッシュ化されます。冗長な分散セキュリティ。 (キーロガーなどを使用して)プレーンテキストのパスワードが入力されたマシンに攻撃者がいない限り、攻撃者は複数のハッシュ/暗号化レイヤーを解読する必要があり、システムのどのノードも、プレーンテキストのパスワードから、DBに格納されているハッシュに到達することがわかっている。

サーバー上で実行されるハッシュは、bcryptやscryptなどの高価なものでなければなりません。クライアント上のものは依然として暗号強度のハッシュでなければなりませんが、SHA-512のようなより高速なものでも問題ありません。

4
KeithS

現在利用可能な最も安全なプロトコルには、公開鍵暗号が含まれます。

  • サーバー上に「サーバー」秘密鍵を生成します。秘密鍵がサーバーを離れることはありません。どういうわけか、アプリに対応する公開鍵を取得します。これを処理する最も一般的な方法は、HTTPS(TLS)の使用です。通常、Webサーバーのsysadminは約100ドルを支払い、認証局によって署名された公開鍵を取得します。しかし、これは技術的には必要ありません。
  • アプリがそのデバイスで初めて実行されるときに、アプリでローカルに「デバイス」秘密鍵を生成します。秘密鍵がデバイスを離れることはありません。 (ベストプラクティスは、「署名」秘密鍵と「暗号化」秘密鍵の両方を生成し、それらから派生した公開鍵を生成することです)。おそらく、ユーザーがアカウントを作成するときに、これらの公開鍵をアプリからサーバーに取得します。
  • 何らかの相互認証を使用します。 TLSの(オプションの)「クライアント認証」部分(「クライアント認証TLSハンドシェイク」)は、これを行う1つの方法であると言われました。

悲しいかな、複数のデバイス(それぞれが独自の秘密/公開キーペアを持つ)を持つ単一のユーザーを処理するのは少し難しいです。

0
David Cary

password-authenticated key Agreement (PAKE)プロトコルを探しているようです。私の理解は、「 安全なリモートパスワードプロトコル (SRP)または他のPAKEプロトコルをサポートするソフトウェアライブラリがいくつかあることであり、 GnuTLSOpenSSL =、 Bouncy Castle 、および その他のTLS実装

0
David Cary