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