2016-07-14 8 views
4

私はアンドロイドモジュールを開発しています。自動ログインや他のもののためにjwtトークンを保存するには、共有環境設定を使用する必要があります。共有設定セキュリティ

「トークン」などのようなキーで保存します。

問題がある:

開発者は自分のアプリケーションのための私のモジュールをインポートし、キーを見つけた場合、彼は簡単に私のJWTトークンを読み取ることができ、そしてそれは私のために良いしないだろう。

代替ソリューションを教えてください。

編集:私の最小APIレベルは、あなたが共有好みに保存する前に、あなたのトークンを暗号化することができ、あなたが使用する必要があるとき、あなたはそれを解読して使用することができます14

+1

私はそれをしたことはありませんが、昨日検索しました。これをチェックしてください。 https://github.com/sveinungkb/encrypted-userprefs –

+0

環境設定が保存されているディレクトリが保護されています。デバイスが根元にない限り、あなたは良いです。 –

+0

@ミスタースミス、はい、私はそれを知っています。しかし、私のモジュールを使っている開発者は、jwtの鍵を知っていれば、彼のアプリケーションから簡単に読むことができます。 –

答えて

0

でなければなりません。私はあなたが共有好みに保存しているとき、あなたの代わりに「トークン」

のunpredictibleキーを使用することをお勧め

は、ここでデータの暗号化と復号化にAndroidアプリで使用可能な暗号化クラスです。

public final class Encryption { 
    private static final String CHIPHER_TRANSFORMATION = "AES/ECB/PKCS5Padding"; 
    private static final String GENERATE_KEY__ALGORITHM = "PBKDF2WithHmacSHA1"; 
    private static final String GENERATE_KEY_ALGORITHM = "AES"; 
    public static final int CRYPTO_TYPE_ENCRYPT = 0; 
    public static final int CRYPTO_TYPE_DECRYPT = 1; 

    public static String crypto(String inString, int type, String hashKey, String salt, String charset) { 
     Cipher cipher = null; 
     try { 
      cipher = Cipher.getInstance(CHIPHER_TRANSFORMATION); 
      byte[] inputByte = inString.getBytes(charset); 
      switch (type) { 
       case CRYPTO_TYPE_DECRYPT: 
        cipher.init(Cipher.DECRYPT_MODE, initKey(hashKey, salt)); 
        return new String(cipher.doFinal(Base64.decode(inputByte, Base64.DEFAULT))); 
       case CRYPTO_TYPE_ENCRYPT: 
        cipher.init(Cipher.ENCRYPT_MODE, initKey(hashKey, salt)); 
        return new String(Base64.encode(cipher.doFinal(inputByte), Base64.DEFAULT)); 
      } 
     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } catch (NoSuchPaddingException e) { 
      e.printStackTrace(); 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } catch (IllegalBlockSizeException e) { 
      e.printStackTrace(); 
     } catch (BadPaddingException e) { 
      e.printStackTrace(); 
     } catch (InvalidKeyException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    private static SecretKey getSecretKey(char[] password, byte[] salt) throws NoSuchAlgorithmException, InvalidKeySpecException { 
     SecretKeyFactory factory = SecretKeyFactory.getInstance(GENERATE_KEY__ALGORITHM); 
     KeySpec spec = new PBEKeySpec(password, salt, 1024, 128); 
     SecretKey tmp = factory.generateSecret(spec); 
     return (new SecretKeySpec(tmp.getEncoded(), GENERATE_KEY_ALGORITHM)); 
    } 

    private static SecretKey initKey(String hashKey, String salt) { 
     try { 
      return getSecretKey(hashKey.toCharArray(), salt.getBytes()); 
     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } catch (InvalidKeySpecException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 
+0

私が以前に言ったように、私がAESを使うと、パスワードや鍵をどこかに保存しなければならないので、問題は繰り返されます。 –

+0

Javaコードを簡単にデコンパイルすることができます。したがって、経験の浅い攻撃者による攻撃だけを防ぐことができます。 – Robert

+0

はい、あなたは正しいですが、私はそこに共有されたprefについてアンドロイドで100%安全な方法がないと思います。 – savepopulation

1

この問題はそれほど簡単ではありません。私が知っていることは、NDKを使ってキーを何らかの形で保存することです。 Cコードは逆コンパイルが難しく、保護レベルは単純なJavaを使用するよりも高くなります。
Obfuscating Android Applications using O-LLVM and the NDK

もう1つの解決策は、文字列難読化器を使用することです。しかし、一般的に言えば、あいまいさによるセキュリティは決して良い考えではありません。
Protect string constant against reverse-engineering

+0

あなたの最初のアイデアは面白そうです! –

-1

Androidのキーストアシステムは、あなたはそれがより困難デバイスから抽出するために作るために容器の中に秘密鍵を保存することができます。キーがキーストアに配置されると、非公開鍵素材をエクスポートできない状態で暗号操作に使用できます(注:1つの問題は、APIレベル18に導入されました)

Androidを使用するAndroidセキュア共有設定:ストアシステム
https://github.com/ophio/secure-preferences

は別の解決策、詳細については、[APIレベル8]
https://medium.com/@vashisthg/android-secure-shared-preferences-10f8356a4c2b#.8nf88g4g0

この記事を参照してくださいこれはあなたを助けるでしょうObscured Shared Preferences for Android

[ObscuredSharedPreferences.java] https://github.com/RightHandedMonkey/WorxForUs_Library/blob/master/src/com/worxforus/android/ObscuredSharedPreferences.java

願っています!

+0

私は私の質問を編集し、私はAPIを使用する必要があります14.あなたの答えをありがとう。 –

+1

Androidキーストアはアプリケーションレベルで動作します。サードパーティ製のアプリケーションでモジュールについて説明しているので、このアプリケーションはモジュールがアクセスできるすべてのキーにアクセスできます。したがって、この状況では役に立たないでしょう。 – Robert

関連する問題