2017-04-26 7 views
10

認証後にサーバーからアクセストークンを取得しました。"uyhjjfjfgg567f8fhjkkf"と言います。これをデバイスに安全に保存します。私はアンドロイドの開発者サイトでキーストアとキーチェーンを調べました。私はそれがどのように動作し、キーストアからトークンを取り出すべきかをはっきりと理解していません。Oauthを安全にアンドロイドに保存する方法

KeyPairGenerator kpg = KeyPairGenerator.getInstance(
     KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore"); 
kpg.initialize(new KeyGenParameterSpec.Builder(
     alias, 
     KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY) 
     .setDigests(KeyProperties.DIGEST_SHA256, 
      KeyProperties.DIGEST_SHA512) 
     .build()); 

KeyPair kp = kpg.generateKeyPair(); 


/* 
* Load the Android KeyStore instance using the the 
* "AndroidKeyStore" provider to list out what entries are 
* currently stored. 
*/ 

KeyStore ks = KeyStore.getInstance("AndroidKeyStore"); 
ks.load(null); 
Enumeration<String> aliases = ks.aliases(); 

答えて

9

アクセストークンを保存する必要はありません。なぜなら、とにかく寿命が短いからです。それを記憶に残すことは十分です。

  • ファイルで
    • 直接内部ストレージ
    • または使用中のファイルに:あなたはリフレッシュトークンを維持する必要がある、とあなたはそのためのいくつかのオプションがあり

    • またはTを使用したデータベース
  • SharedPreferencesAccountManager

StoredCredentialを使用することを検討してください。フロー自体については、Google AppAuth libraryを使用することをお勧めします。もちろん

、あなたはまた、暗号を使用してキーを暗号化することができます。

private static byte[] encrypt(byte[] key, byte[] text) throws GeneralSecurityException { 
    final SecretKeySpec skeySpec = new SecretKeySpec(key, KEY_ALGORITHM); 
    final Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); 
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec, sInitVectorSpec); 
    return cipher.doFinal(text); 
} 

とキーはKeyStoreに保存することができます。

2

Here Androidセキュリティで利用可能な可能性について、Androidauthorityが本当に良い記事を見つけることができます。

Androidキーストアの実装の包括的な例はhereです。

もう1つの良い選択肢はGoogle's keyczarで、gitリポジトリでサンプルと詳細を確認できます。そこにはKnown Security Issuesの詳細なリストもありますので、それがあなたのさらなる実装に合っているかどうかを確認できます。

あなたの現在の問題については、上記の2番目のリンクの実装例に従ってAndroidキーストアをお勧めします。

幸運を祈る!

0

カスタムのSharedPreferenceインスタンスを使用して、キーと値を暗号化して追加し、復号化するときに要求します。

SecurePreferences preferences = ... 
preferences.edit().putString("key", "value").apply(); // key and value are encrypted automatically 

String value = preferences.getString("key", null); // key and value are decrypted automatically 

値が暗号化されている場合はxmlファイルがアプリにのみ利用可能であっても、それはカスタマイズされた端末にアクセスすることができるので、私は唯一、SharedPreferencesを使用することをお勧めします。

既にSqlLiteDBを使用している場合は、おそらくそれを使用します。そうでなければ、ちょうどトークンを保存するために少し重いです。

EDIT:

のOAuthトークンをアプリに署名するために使用されるキーとキーストアとは全く無関係です。

oauthトークンは、アプリケーション内でユーザーの資格情報を検証した後にサーバーによって提供されるトークンです。

キーストアには、アプリケーションにデジタル署名するために使用される1つ以上の証明書が含まれています。これは、他のユーザーが自分と同じパッケージ名のアプリケーションをアップロードして置き換えないようにするためです。

関連する問題