現在Android OAuthを使用してサービスにサインインするアプリを作成しています。OAuthでは、クライアントIDとクライアントシークレットを提供する必要があります私のアプリを識別できるように、サービスに追加します。今は、次のような資格情報を保存しています。
public class Creds {
public static final String CLIENT_ID = "THE_CLIENT_ID";
public static final String CLIENT_SECRET = "THE_CLIENT_SECRET";
}
明らかに、これはまったく安全ではありません。誰でも decompile APKファイルを使用して、文字列を即座に確認できます。人々がそうすることを防ぐにはどうすればよいですか?
十分な努力を払っても誰でも文字列を再作成できるため、難読化ツールを許容できるソリューションとは見なしません。
注:これは この質問 のまとまりではありません。ソース文字列を非表示にせず、文字列をソース管理から除外する方法について説明しているためです。 APKファイル内。たとえば、キーを含む構成ファイルはソース管理の対象外にしておくことができますが、逆コンパイルされたAPKには存在します。
edit:文字列をネイティブコードに入れて、JNI経由で取得するとどうなりますか?ネイティブコードは逆コンパイルがはるかに困難です。
なぜそれは秘密を保持しているのですか?アプリは決して秘密を保持するべきではありません。
認証のラウンドトリップを実行するためのバックエンド(または使用している検証サービス)は秘密を保持している必要があり、他に何も含まれていてはなりません。ユーザーがクライアントIDを使用できるようにする必要があります。これは、ユーザーが表示できるようにするために、ユーザーが認証の対象を知るために使用するものです。
再び; 秘密は秘密ですそして、あなたはユーザーにそれを垣間見る機会さえ与えてはなりません。そうすれば、だれでもあなたのようにポーズできます。