AES/CBC를 사용하는 것보다 안전하다는 경고를 받았기 때문에 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는 각 암호화에 대해 다른 임의의 값을 필요로하며 일반적으로 암호화 된 데이터의 접두어로 사용됩니다. 2. 암호 해독 키가 메모리에있는 실행 코드에 대한 공격에 실패합니다. 3. 사용 후 메모리의 키를 겹쳐 쓰는 것 또한 필요합니다.이 키는 사용하기가 까다로울 수 있습니다. – zaph
왜 암호화 및 암호 해독 대신 해시가 필요합니까? – user641887