私は、Webコンポーネントも持つiOSアプリに取り組んでいます。ユーザーがアカウントを作成すると、そのパスワードはソルトおよびハッシュされます。私はすでにハッシュアルゴリズムをWeb側で機能させています。
新しいユーザーがアプリでアカウントを作成するとき、iOSアプリは自分のパスワードをハッシュし、それをサーバーに送信してデータベースに直接挿入する必要がありますか?または、パスワードをプレーンテキストでサーバーに送信し、そこでハッシュ化する必要がありますか?アプリ内で暗号化し、サーバーに送信し、復号化してからハッシュ化する必要がありますか?最善かつ最も安全なプロトコルが何であるか私にはわかりません。ログインしようとしている既存のユーザーを認証する場合も、同じ質問が当てはまると思います。
また、現時点ではサーバーにSSLを設定していませんが、これが役立つ場合は、それを実行してもかまいません。
SSLを使用してインターネット上の通信を安全に処理し、サーバーでパスワードをハッシュ化します。それ以外の場合、サービスに関する限り、パスワードハッシュは単にパスワードになり、データベースにアクセスする攻撃者は、パスワードがプレーンテキストで保存されているかのように、任意のユーザーとしてログインできます。 SSLは、ユーザーの資格情報がネットワーク上で傍受されるのを防ぐために不可欠です。
なぜ両方できないのですか?ユーザーがパスワードを入力すると(新しいユーザーとして、またはログイン中に)、クライアント側でハッシュし、安全なチャネルを介してサーバーに送信します。これにより、比較を行う前に再度ハッシュ化されます。冗長な分散セキュリティ。 (キーロガーなどを使用して)プレーンテキストのパスワードが入力されたマシンに攻撃者がいない限り、攻撃者は複数のハッシュ/暗号化レイヤーを解読する必要があり、システムのどのノードも、プレーンテキストのパスワードから、DBに格納されているハッシュに到達することがわかっている。
サーバー上で実行されるハッシュは、bcryptやscryptなどの高価なものでなければなりません。クライアント上のものは依然として暗号強度のハッシュでなければなりませんが、SHA-512のようなより高速なものでも問題ありません。
現在利用可能な最も安全なプロトコルには、公開鍵暗号が含まれます。
悲しいかな、複数のデバイス(それぞれが独自の秘密/公開キーペアを持つ)を持つ単一のユーザーを処理するのは少し難しいです。
password-authenticated key Agreement (PAKE)プロトコルを探しているようです。私の理解は、「 安全なリモートパスワードプロトコル (SRP)または他のPAKEプロトコルをサポートするソフトウェアライブラリがいくつかあることであり、 GnuTLS 、 OpenSSL =、 Bouncy Castle 、および その他のTLS実装 。