アプリのセキュリティの最初のルール:攻撃者が無制限の物理的または電子的アクセスを取得するマシンは、実際の場所や料金に関係なく、攻撃者に帰属します。
アプリのセキュリティの2番目のルール:攻撃者が侵入できない物理的な境界を離れるソフトウェアは、コーディングに費やした時間に関係なく、攻撃者に帰属します。
3番目のルール:攻撃者が侵入できない同じ物理的境界を離れる情報は、それがあなたにとってどれほど価値があるとしても、攻撃者に帰属します。
情報技術セキュリティの基盤は、これら3つの基本原則に基づいています。真に安全な唯一のコンピューターは、金庫の中に、ファラデーの檻の中に、鋼鉄の檻の中に閉じ込められたコンピューターです。ほとんどの耐用年数をこの状態で過ごすコンピューターがあります。年に1回(またはそれ以下)、信頼できるルート証明機関の秘密鍵を生成します(カメラが置かれている部屋の隅々まで記録している多数の目撃者の前で)。
現在、ほとんどのコンピューターはこれらのタイプの環境では使用されていません。彼らは物理的に戸外に出ており、無線無線チャネルを介してインターネットに接続されています。要するに、彼らのソフトウェアと同様に、彼らは脆弱です。したがって、それらは信頼されるべきではありません。コンピュータとそのソフトウェアが有用であるために知っているか実行しなければならない特定のことがありますが、損傷を引き起こすのに十分なことを認識または実行できないように注意する必要があります(少なくともその単一のマシンの範囲外の永続的な損傷ではありません) )。
あなたはすでにこれをすべて知っていました。そのため、アプリケーションのコードを保護しようとしています。しかし、そこに最初の問題があります。難読化ツールは、人間が掘り下げようとするコードを混乱させる可能性がありますが、それでもプログラムを実行する必要があります。つまり、アプリの実際のロジックフローと、アプリが使用するデータは、難読化の影響を受けません。少しの粘り強さがあれば、攻撃者はコードの難読化を簡単に解除できます。これは、自分が見ているものが自分が探しているもの以外の何物でもない特定の場合でも必要ありません。
代わりに、攻撃者がコードの明確なコピーを取得するのがどれほど簡単であっても、攻撃者がコードに対して何もできないようにする必要があります。つまり、ハードコードされたシークレットはありません。コードが開発した建物を離れるとすぐにそれらのシークレットは秘密にならないからです。
ハードコーディングしたこれらのキー値は、アプリケーションのソースコードから完全に削除する必要があります。代わりに、3つの場所のいずれかに配置する必要があります。デバイスの揮発性メモリ。攻撃者がオフラインコピーを取得するのは困難です(ただし、それでも不可能ではありません)。サーバークラスター上に永続的に存在し、そこへのアクセスを鉄の拳で制御します。または、物理カードやユーザーのメモリなど、デバイスやサーバーに関係のない2番目のデータストアにあります(つまり、最終的には揮発性メモリになりますが、長くする必要はありません)。
次のスキームを検討してください。ユーザーは、アプリのクレデンシャルをメモリからデバイスに入力します。残念ながら、ユーザーのデバイスがキーロガーやトロイの木馬によって侵害されていないことを信頼する必要があります。この点でできる最善のことは、ユーザーが使用したデバイス(MAC / IP、IMEIなど)に関する偽造が難しい識別情報を記憶し、次の方法で少なくとも1つの追加チャネルを提供することにより、多要素セキュリティを実装することです。なじみのないデバイスでのログイン試行を確認できます。
入力されたクレデンシャルは、クライアントソフトウェアによって(安全なハッシュを使用して)難読化され、プレーンテキストのクレデンシャルは破棄されます。彼らは彼らの目的を果たしました。難読化された資格情報は、セキュリティで保護されたチャネルを介して証明書認証サーバーに送信されます。サーバーは、ログインの有効性を検証するために使用されるデータを生成するために、それらを再度ハッシュします。このように、クライアントはデータベース値と実際に比較されるものを知ることはなく、アプリサーバーは検証のために受け取るものの背後にあるプレーンテキストの資格情報を知ることはなく、データサーバーは検証のために保存するデータがどのように生成されるかを知ることはありません。真ん中は、安全なチャネルが危険にさらされたとしても、ぎこちないものしか見えません。
検証されると、サーバーはチャネルを介してトークンを送り返します。トークンは安全なセッション内でのみ有用であり、ランダムノイズまたはセッション識別子の暗号化された(したがって検証可能な)コピーで構成され、クライアントアプリケーションはリクエストの一部として同じチャネルでこのトークンをサーバーに送信する必要があります何かをするために。クライアントアプリケーションはこれを何度も実行します。これは、金銭、機密データ、またはそれ自体に損害を与える可能性のあるその他の処理を実行できないためです。代わりに、サーバーにこのタスクを実行するように依頼する必要があります。クライアントアプリケーションは、少なくともプレーンテキストではなく、デバイス自体の永続メモリに機密情報を書き込むことはありません。クライアントは、セキュリティで保護されたチャネルを介してサーバーに対称キーを要求し、サーバーが記憶するローカルデータを暗号化できます。後のセッションで、クライアントは、揮発性メモリで使用するデータを復号化するために同じキーをサーバーに要求できます。そのデータだけがコピーになるわけではありません。クライアントが保存するものはすべて、何らかの形でサーバーに送信する必要があります。
明らかに、これによりアプリケーションはインターネットアクセスに大きく依存するようになります。クライアントデバイスは、サーバーへの適切な接続とサーバーによる認証がないと、基本的な機能を実行できません。本当にFacebookと違いはありません。
さて、攻撃者が望んでいるのはあなたのサーバーです。なぜなら、クライアントアプリ/デバイスではなく、攻撃者がお金を稼いだり、他の人に彼の楽しみを苦しめたりする可能性があるからです。それで大丈夫です; すべてのクライアントを保護しようとするよりも、サーバーを保護するためにお金と労力を費やすほうがはるかに大きなメリットがあります。サーバーは、あらゆる種類のファイアウォールやその他の電子セキュリティの背後に置くことができ、さらに、鋼、コンクリート、キーカード/ピンアクセス、および24時間のビデオ監視の背後に物理的に保護することができます。攻撃者は、サーバーへのあらゆる種類のアクセスを直接取得するために、実際に非常に高度である必要があり、すぐにそれを知る必要があります。
攻撃者ができる最善のことは、ユーザーの電話と資格情報を盗み、クライアントの制限された権限でサーバーにログインすることです。これが発生した場合、クレジットカードを紛失した場合と同様に、正当なユーザーは800番に電話するように指示する必要があります(財布、財布、ブリーフケースに入れて持ち歩くカードの裏側ではなく、覚えやすいことが望ましいです。モバイルデバイスと一緒に盗まれた)アクセス可能な任意の電話から、カスタマーサービスに直接接続します。彼らは、電話が盗まれたと述べ、基本的な一意の識別子を提供し、アカウントがロックされ、攻撃者が処理できた可能性のあるすべてのトランザクションがロールバックされ、攻撃者は元の状態に戻ります。