2017-01-17 16 views
2

私はAndroid KeyStoreを使用しています。私はKeyStore全体と各パスワード入力用のパスワードを設定しました。これらのパスワードは文字列であるため、文字列メンバにコードとして格納されます。安全にAndroid KeyStoreのパスワードを保存する方法

攻撃者がapkを逆コンパイルしてパスワードを取得する可能性があるため、アプリを公開する場合は安全ではありません。アプリでハードコードされているためです。

私の質問は以下のとおりです。上記のシナリオで

  1. :攻撃者は、ファイルが唯一の私のアプリによってアクセスすることができる(無根電話で)私のキーストアファイルまたはを読むことができるだろうとそうパスワードだけ十分ではありませんか?
  2. KeyStoreパスワードを処理するベストプラクティスは何ですか?私は周りを見回しましたが、これに対処するための決定的な答えは見つかりませんでした。

編集のための編集:私はアプリの署名については話しませんが、パスワードで保護されたAndroid KeyStoreに暗号鍵を保存することについては言及していません。アプリはキー入力を取得するために実行時にパスワードにアクセスする必要があります。現在のコードの

例:

String keyStorePwd = "password1"; 
String keyEntryPwd = "password2"; 

FileInputStream fis = getApplicationContext().openFileInput("sms.keystore"); 
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 

ks.load(fis, keyStorePwd.toCharArray()); 

SecretKey key = (SecretKey) ks.getKey("aes_key_sms_notifier", keyEntryPwd.toCharArray()); 
fis.close(); 
+0

たぶん、あなたはhttps://github.com/scottyab/secure-preferences – Prexx

+1

@Prexx悪いアイデアを使用することができます。 1つは、なぜあなたはすべてのもののセキュリティのためのギブスのランダムなライブラリを信頼しますか?第二に、安全な設定を暗号化するには、鍵が必要です。それはあなたのアプリにキーがあることを意味します。それは無意味なスピードバンプになります。 –

+0

grade.propertiesを使用しています。あなたのパスをそこに格納します – ZeroOne

答えて

1

あなたのAPKでパスワードを保存することは推奨されません。私たちがキーストアのパスワードについて話しているときにはるかに多く。はい、攻撃者はパスワードを読み取る方法を見つけ出すことができます。なぜなら、攻撃者はパスワードを読み取ることができるからです。無謀に含まれたパスワードをAPKに読んでください。あなたがgradleを使っていると仮定して、キーストアのパスワードを保存する方法については、gradleを使って指定された方法があります。あなたのパスワードを格納するファイルである、keystore.propertiesを除外するために、あなたの.gitignoreファイルを修正し、バージョン管理を使用している場合

PROPERTIESは
を提出します。その後、レポに押し込みます。これを行うと、共有プロジェクトの他の開発者がキーストアの詳細を知ることができなくなります。実際のkeystore.propertiesファイルをプロジェクトのルートに作成できるようになりました。

def keystorePropertiesFile= rootProject.file("keystore.properties") 
def keystoreProperties = new Properties() 
keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) 

android { ... } 
次のようなあなたの android { ... }節外の変数プロパティを定義することによって、あなたのモジュールレベルのGradleビルドファイルを修正し、あなたの keystore.propertiesファイルを設定した後

keyAlias yourKeyAlias 
keyPassword yourKeyPassword 
storeFile pathOfYourKeyStoreFile 
storePassword passwordOfYourKeyStoreFile 

のGradle
:ファイルには、以下が含まれている必要がありますandroid { ... }インサイド

、宣言signingConfigs { ... }よう:

android { 
    signingConfigs { 
    config { 
     keyAlias keystoreProperties['keyAlias'] 
     keyPassword keystoreProperties['keyPassword'] 
     storeFile file(keystoreProperties['storeFile']) 
     storePassword keystoreProperties['storePassword'] 
    } 
    } 

    ........... 

} 

最後に、まだモジュールレベルのグラデルビルドファイル内には、debug { ... }release { ... }の設定をデフォルトとして含むbuildTypes { ... }節があるはずです。 release構成を変更し、そのようなこと:あなたのAPKにキーストアのパスワードを保存せずにリリースビルド、これらのすべてを作成することを選択するたびに自動的にあなたのAPKに署名することができますrelease { ... }signingConfig signingConfigs.configを定義

buildTypes { 
    debug { 
     *insert debug configs here* 
    } 
    release { 
     *insert release configs here* 

     signingConfig signingConfigs.config 
    } 
    } 

。乾杯!

+0

キーストアを使用してAES暗号化用の鍵を保管し、私のアプリからKeyStoreパスワードにアクセスする必要がある場合、どうすればよいですか?この階調ソリューションで可能ですか? – JoeFox

+0

@JoeFoxあなたは達成しようとしていることを説明できますか?私はAESのキーは実際に必要なものではないと思います。 – divegeek

+0

私は、デスクトップコンピュータとアプリの間の安全な通信を実装したかったのです。これを実現するために、鍵と証明書をキーストアに保存したかったのです。私の考えは、このキーストアにパスワードを安全に保存して、誰もキーストアの秘密にアクセスできないようにすることでした。 – JoeFox

1

Androidアプリケーション(.apkファイル)のパスワードを保護する絶対的な方法はありません。しかし、あなたはそれを保護しようとすることができます:

  • ソースコードを難読化してください。他の人は、情報を保護するために使用した方法を見つけるのに多くの時間がかかります。
  • ソースコード内のすべての文字列を難読化します。クリアテキストの文字列はすべて非表示になり、誰も簡単に見ることができません。

次の2つの方法でそれを行うことができます。

  1. その後、 ソースコードを難読化するためにProGuardのを使用し、手動ですべての文字列を難読化。
  2. 使用:Bg+ Anti Decompiler/Obfuscator。それはだ、難読化隠し、偽造、チェックすることにより、AndroidのJavaソースを保護するための新しいソリューションです...技術
関連する問題