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やコードに保存されることはありません。
私はすべてを正しくしましたか?
[codereview.se]のリクエストのようです。 – shmosel
1.IVは、各暗号化ごとに異なるランダム値を必要としますが、一般に、暗号化されたデータのプレフィックスになります。これは、解読鍵がメモリ内にある実行コードに対する攻撃に対して失敗する。 3.メモリ内のキーは、使用後に上書きされ、リリースされたばかりでなく、扱いにくいことが必要です。 – zaph
暗号化と復号化の代わりにハッシュを使用してみませんか? – user641887