我试图在我的代码中保护秘密字符串,我做的一切都正确吗?

时间:2017-10-29 20:06:02

标签: java android encryption cryptography obfuscation

我编写了这段代码,用于加密和解密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或代码中。

我做对了吗?

1 个答案:

答案 0 :(得分:0)

您可以使用salted和迭代加密哈希。代码中的实际答案永远不会出现。

在开发过程中通过PBKDF2Rfc2898DeriveBytesBcrypt或类似函数等函数运行答案,并将结果+ salt添加到代码中。它不可逆转并且抵抗暴力攻击。

在代码中,用户回答并使用相同的盐通过相同的方法运行它并比较结果。