web-dev-qa-db-ja.com

ソースコードでAPIキーを非表示にする最良の方法

アプリケーション、特にc#.NETアプリケーションでプライベートAPIキーを保護する方法についてのアイデアが必要です。

まず、ソースコードに何かを隠すことは理論的に不可能であることを理解しているので、別のアイデアを思いつきましたが、それがどれほど妥当かはわかりません。とにかく、何らかの方法でWebサーバーと通信して秘密キーを確認し、アプリケーションに戻ってそれが正当なハンドシェイクであることを確認することはできますか?

使用するキーは2つあります。公開キー(名前が示すように、プライベートキーと同じように扱う必要はありません)と、他のユーザーから安全に保管する必要があるプライベートキーです。

私がこれをどのように行うことができるかについてのアイデアは大歓迎です。

12
Spencer

要約する:

  • ベンダーがAPIキーを使用できるようにAPIキーを発行していて、このキーが他人に知られるのを防ぐ義務がある
  • アプリケーションコードでそのベンダーのAPI(APIキーが必要)を呼び出している
  • 顧客がバイナリにアクセスできるシステムにアプリケーションをデプロイしているため、コードを逆コンパイル/難読化解除したり、トラフィックを傍受したりする可能性がある

このキーの侵害を防ぐ最善の方法は、キーの制御を維持することです。これは、あなた以外の誰もがバイナリを読み取ることができるサーバーに展開してはならず、制御できない通信リンクを経由しないでください。

最終的に、バイナリが管理できない場合、バイナリのすべてが管理できなくなります。同様に、誰かがトラフィックを傍受できれば、APIキーを取得できます( SSLを使用している場合でも )。

これを実現する2つの主要な方法を確認できます。どちらの方法でも、デプロイされたアプリケーションにプライベートAPIキーが含まれていません。

デプロイメントごとに固有のAPIキーを取得する

これには、キーを取得したり、顧客にキーを取得させたりできるベンダーとの追加の関係が必要になります。

これは、実際には、たとえば、Google Maps APIを使用する製品では非常に一般的です。ソフトウェアの作成者は、コピーの開発/実行中に使用する独自のキーを持っていますが、ソフトウェアには含まれていません。代わりに、ソフトウェアをインストールするユーザーとして、Googleにアクセスして独自のAPIを取得する必要がありますキー。ソフトウェアには、使用するGoogle Maps APIキーを設定するための設定オプションがあります。

実際、契約でAPIキーを発行する多くのベンダーは、この方法で行うことを要求しているため、いずれにしても間違ったパスを外れている可能性があります。これは、ベンダーの利用規約に従って使用できる唯一のソリューションである可能性があります。 /またはあなたが彼らと持つかもしれないあらゆる法的契約。

プロキシを使用する

アプリケーションがサーバー上でAPIを呼び出すプロキシAPIを設定します。次に、APIがキーを使用してベンダーのAPIを呼び出します。

APIに追加の保護が必要な場合があります。たとえば、アプリケーションのみが確実にそれを使用するようにするためのものです。これは次の方法で実行できます。

  • 機能を非常に具体的にするだけで、アプリはそれを使用できます
  • IPホワイトリスト
  • サーバーにすでにあるいくつかの既存のライセンス/承認メカニズム
  • 顧客にキーを発行できる独自のAPIキーシステム

ここで覚えておくべきことは、これを行うことが許可されていない可能性があるということです。ベンダーには、「集約サービス」またはプロキシの構築を妨げる利用規約または法的契約がある可能性があるため、確認する必要があります。


不正行為への対応

キーが危険にさらされなくても、顧客の1人がベンダーにキーをブロックさせるような行動をとっている場合、突然すべての顧客が無効になり、唯一の解決策は他の全員を更新することです。

同様に、あなたがあなたの顧客の1つをブロックしたい場合(たとえば、彼らが支払いをやめた、ソフトウェアを海賊版にしたなど)なら、それはできません他の全員に更新を発行せずに、キーを無効にします。

少数のクライアントを超えた場合のこのロジスティクスは、すぐに受け入れられなくなります。

プロキシとして機能する場合でも、インストールごとに固有のキーを持つ場合でも、これらの状況は比較的簡単に処理できます(他の人への影響はほとんどありません)。


ソフトウェアに組み込まれているキーを保護しようとしても、最終的には無駄な作業になります。あなたが何をしようとも、バイナリ、ソース、通信チャネルにアクセスでき、それらのキーに到達するために十分に決定されている攻撃者は、そうすることができます。

埋め込まないでください。 「勝つ唯一の手はプレーしないことだ」と語った。

14
gregmac

オブジェクトコードにキーがある場合、そのキーは定義により公開されます。オブジェクトコードをすばやく逆コンパイルする難読化ツールの周りにハックがあります。秘密鍵は、オブジェクトコードの外と別のファイルにあります。難しいのは、この秘密鍵をユーザーに提供することです。提供されると、ファイルの最後に付けられた秘密鍵の署名とアプリケーション内の公開鍵を使用して、秘密鍵の整合性を検証できます。安全な通信チャネルがある場合は、Webサーバーでもこの検証を実行できます。

5
Frank Hileman