2017-10-29 6 views
0

私はAES/ECBを使用するよりも安全であると警告されているため、AES/CBCの文字列を暗号化および復号化するこのコードを書きました。私はコード内の秘密の文字列を保護しようとしています。

private static final String IV = "nVj1Vakka8jaVn9d"; 

private static final String AES_MODE = "AES/CBC/PKCS7Padding"; 
private static final String CHARSET = "UTF-8"; 

public static String encrypt(String message, String password) { 
    try { 
     byte[] messageBytes = message.getBytes(CHARSET); 
     SecretKeySpec key = new SecretKeySpec(password.getBytes(CHARSET), AES_MODE); 
     IvParameterSpec ivSpec = new IvParameterSpec(IV.getBytes(CHARSET)); 

     Cipher cipher = Cipher.getInstance(AES_MODE); 
     cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec); 
     byte[] cipherText = cipher.doFinal(messageBytes); 

     return Base64.encodeToString(cipherText, Base64.NO_WRAP); 
    } catch(Exception ex) { 
     return null; 
    } 
} 

public static String decrypt(String base64EncodedCipherText, String password) { 
    try { 
     byte[] encodedBytes = Base64.decode(base64EncodedCipherText, Base64.NO_WRAP); 
     SecretKeySpec key = new SecretKeySpec(password.getBytes(CHARSET), AES_MODE); 
     IvParameterSpec ivSpec = new IvParameterSpec(IV.getBytes(CHARSET)); 

     Cipher cipher = Cipher.getInstance(AES_MODE); 
     cipher.init(Cipher.DECRYPT_MODE, key, ivSpec); 
     byte[] decryptedBytes = cipher.doFinal(encodedBytes); 

     return new String(decryptedBytes, CHARSET); 
    } catch(Exception ex) { 
     return null; 
    } 
} 

私のアプリケーションには、デコンパイラでは表示しないでください。これらの文字列はすべて、この暗号化メソッドの戻り値によってStringフィールドで暗号化されます。理論上のIVは秘密ではなく、クラスの文字列フィールドとして単純に入れます。パスワードは必要に応じてFirebaseによって安全に復元され、SharedPreferencesやコードに保存されることはありません。

私はすべてを正しくしましたか?

+3

[codereview.se]のリクエストのようです。 – shmosel

+0

1.IVは、各暗号化ごとに異なるランダム値を必要としますが、一般に、暗号化されたデータのプレフィックスになります。これは、解読鍵がメモリ内にある実行コードに対する攻撃に対して失敗する。 3.メモリ内のキーは、使用後に上書きされ、リリースされたばかりでなく、扱いにくいことが必要です。 – zaph

+0

暗号化と復号化の代わりにハッシュを使用してみませんか? – user641887

答えて

0

暗号化ハッシュを反復して使用することができます。実際の答えは決してコード内には現れません。

開発中にPBKDF2,Rfc2898DeriveBytesBcryptまたは同様の機能のような関数で答えを実行し、結果+塩をコードに追加します。それは可逆攻撃ではなく、強引な攻撃に耐性がありません。

コードでは、ユーザーが答えを出し、同じ塩を使用して同じ方法で実行し、結果を比較します。

関連する問題