アプリケーションでプライベート API キーを保存および保護するためのベスト プラクティス [closed] 質問する

アプリケーションでプライベート API キーを保存および保護するためのベスト プラクティス [closed] 質問する

ほとんどのアプリ開発者は、アプリにサードパーティのライブラリを統合します。Dropbox や YouTube などのサービスにアクセスする場合や、クラッシュをログに記録する場合などです。サードパーティのライブラリとサービスの数は膨大です。これらのライブラリとサービスのほとんどは、何らかの方法でサービスに認証することで統合されており、ほとんどの場合、これは API キーを介して行われます。セキュリティ上の理由から、サービスは通常、公開キーと秘密キー (シークレットとも呼ばれる) を生成します。残念ながら、サービスに接続するには、この秘密キーを使用して認証する必要があり、したがって、おそらくアプリケーションの一部である必要があります。言うまでもなく、これは大きなセキュリティ問題に直面します。公開 API キーと秘密 API キーは、APK から数分で抽出でき、簡単に自動化できます。

これに似たものを持っていると仮定すると、秘密鍵をどのように保護できますか?

public class DropboxService  {

    private final static String APP_KEY = "jk433g34hg3";
    private final static String APP_SECRET = "987dwdqwdqw90";
    private final static AccessType ACCESS_TYPE = AccessType.DROPBOX;

    // SOME MORE CODE HERE

}

秘密鍵を保存する最良かつ最も安全な方法は何だと思いますか? 難読化、暗号化、どちらだと思いますか?

ベストアンサー1

  1. コンパイルされたアプリケーションには、キー文字列だけでなく、定数名 APP_KEY と APP_SECRET も含まれています。このような自己文書化コードからキーを抽出するのは、たとえば標準の Android ツール dx を使用すると簡単です。

  2. ProGuard を適用できます。キー文字列はそのまま残りますが、定数名は削除されます。また、可能な限り、クラスとメソッドの名前を短く意味のない名前に変更します。その後、どの文字列がどの目的に使用されているかを判断するために、キーの抽出にさらに時間がかかります。

    ProGuard の設定は、あなたが恐れているほど難しくはありません。まず、project.properties に記載されているように、ProGuard を有効にするだけです。サードパーティのライブラリに問題がある場合は、proguard-project.txt で警告の一部を抑制したり、難読化されないようにしたりする必要があるかもしれません。たとえば、次のようになります。

    -dontwarn com.dropbox.**
    -keep class com.dropbox.** { *; }
    

    これはブルートフォースアプローチです。処理されたアプリケーションが動作したら、このような構成を調整できます。

  3. コード内の文字列を手動で難読化することもできます。たとえば、Base64 エンコードや、できればもっと複雑なもの、場合によってはネイティブ コードなどを使用します。そうすると、ハッカーはエンコードを静的にリバース エンジニアリングするか、適切な場所でデコードを動的に傍受する必要があります。

  4. ProGuardの専門の兄弟のような商用難読化ツールを適用することができますデックスガード文字列とクラスをさらに暗号化/難読化することもできます。キーの抽出にはさらに時間と専門知識が必要です。

  5. アプリケーションの一部を独自のサーバーで実行できる場合があります。キーをそこに保存しておけば、キーは安全です。

結局、キーの重要性、どれだけの時間やソフトウェアを費やせるか、キーに興味を持つハッカーはどれだけ高度な技術を持っているか、ハッカーはどれだけの時間を費やすつもりか、キーがハッキングされるまでの遅延にはどれだけの価値があるか、成功したハッカーはどの程度の規模でキーを配布するか、など、経済的なトレードオフを行う必要があります。キーのような小さな情報は、アプリケーション全体よりも保護が困難です。本質的に、クライアント側には破られないものはありませんが、基準を上げることはできます。

(私はProGuardとDexGuardの開発者です)

おすすめ記事