我编写了这段代码,用于加密和解密AES / CBC中的字符串,因为我被警告说它比使用AES / ECB更安全。
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;
}
}
我的应用程序包含反编译器不应查看的秘密字符串。通过返回此加密方法,所有这些字符串都在字符串字段中加密。理论上的IV并不是秘密,然后我把它简单地放在类中的String字段中,密码在必要时由Firebase安全恢复,并且永远不会保存在SharedPreferences或代码中。
我做对了吗?
答案 0 :(得分:0)
您可以使用salted和迭代加密哈希。代码中的实际答案永远不会出现。
在开发过程中通过PBKDF2
,Rfc2898DeriveBytes
,Bcrypt
或类似函数等函数运行答案,并将结果+ salt添加到代码中。它不可逆转并且抵抗暴力攻击。
在代码中,用户回答并使用相同的盐通过相同的方法运行它并比较结果。