java - AES 算法安全吗?

标签 java android algorithm encryption aes

<分区>

下面是我在对我的 android 项目的 AES 进行一些研究后组合起来的算法,我只想知道它是否安全并且可以改进吗?我问的原因是因为我见过很多不同的方法,只需要一点帮助。

在此先感谢您的帮助。

private static final int pswdIterations = 1000;
private static final int keySize = 256;
private static final int saltlength = keySize / 8;

private static final String ENCODING = "UTF-8";
private static final String PBK = "PBKDF2WithHmacSHA1";
private static final String AES = "AES";
private static final String CIPHER = "AES/CBC/PKCS5Padding";

public String encrypt(String plainText) throws Exception {
    //get text from password field
    final String pass = password.getText().toString();
    //get salt from generateSalt() method (see below)
    String salt = generateSalt();
    //convert salt to bytes
    byte[] saltBytes = salt.getBytes(ENCODING);

    // Derive the key from
    SecretKeyFactory factory = SecretKeyFactory.getInstance(PBK);
    PBEKeySpec spec = new PBEKeySpec(
            pass.toCharArray(),
            saltBytes,
            pswdIterations,
            keySize
    );

    //encode key
    SecretKey secretKey = factory.generateSecret(spec);
    SecretKeySpec secret = new SecretKeySpec(secretKey.getEncoded(), AES);

    //encrypt the message
    Cipher cipher = Cipher.getInstance(CIPHER);
    cipher.init(Cipher.ENCRYPT_MODE, secret);
    AlgorithmParameters params = cipher.getParameters();
    byte[] ivBytes = params.getParameterSpec(IvParameterSpec.class).getIV();
    byte[] encryptedTextBytes = cipher.doFinal(plainText.getBytes(ENCODING));

    //encode text and output final encrypted text
    String encodedText = Base64.encodeToString(encryptedTextBytes, Base64.DEFAULT);
    String encodedIV = Base64.encodeToString(ivBytes, Base64.DEFAULT);
    String encodedSalt = Base64.encodeToString(saltBytes, Base64.DEFAULT);
    return encodedSalt +  encodedText + encodedIV;
}

public static String generateSalt() {
    SecureRandom random = new SecureRandom();
    byte bytes[] = new byte[saltlength];
    random.nextBytes(bytes);
    return new String(bytes);
}

最佳答案

从本质上讲,该方案看起来很安全,但不包括身份验证。

改进:

  1. 在合并结果中包含迭代次数。
  2. 包括一个版本指示符,它可以像单个字节一样简单。
  3. 通常将字节数组连接起来,然后使用一种整体 Base64 编码。

注意事项:
考虑使用 RNCryptor

看看RNCryptor-Spec有关将各种元素包装在一起的示例。

关于java - AES 算法安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46915299/

相关文章:

java - 将圆圈打印到屏幕上

java - 为什么仅在 Ice Cream Sandwich 和 JellyBean 中抛出 FileNotFound

c++ - 为什么 vector 比 unordered_map 快?

algorithm - 什么包含了财富算法中的海岸线?

javascript - 如何在无序二叉树中搜索节点?

java - 无法正确设置我的 pom.xml 以将变量传递到 XML 文件

java - BufferedWriter自动刷新

java - 单击按钮时显示覆盖层,并在使用 Swing 执行操作时再次消失

android - 菜单中的图标比应有的小

java - 如何在java中的url中发送加号运算符