更多AES迭代会导致OutOfMemory Java堆空间

时间:2013-07-01 11:59:20

标签: java encryption aes javax.crypto

在我的程序中,我尝试使用AES加密纯文本,至少提供50次迭代。但问题是我得到了OutOfMemory Error。从帖子Recommended # of iterations....开始,我发现LastPass使用了100,000次迭代。但我甚至无法使用50次迭代的AES。

这是代码,

static String encrypt(String value, String salt) throws Exception {

    Key key = generateKey();
    Cipher c = Cipher.getInstance(ALGORITHM);  
    c.init(Cipher.ENCRYPT_MODE, key);

    String valueToEnc = null;
    String eValue = value;
    for (int i = 0; i < 100; i++) {
        valueToEnc = salt + eValue;
        byte[] encValue = c.doFinal(valueToEnc.getBytes());
        eValue = new BASE64Encoder().encode(encValue);
    return eValue;
    }

我知道使用Base64Encoder会发出警告。所以请不要发布它。我稍后会改变它。

我的问题是,有没有办法增加迭代而不会出现此错误?

对不起,如果这是一个愚蠢的问题,任何答案都表示赞赏。提前谢谢。

这是异常日志,

Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
    at java.lang.StringCoding$StringEncoder.encode(StringCoding.java:300)
    at java.lang.StringCoding.encode(StringCoding.java:344)
    at java.lang.StringCoding.encode(StringCoding.java:387)
    at java.lang.String.getBytes(String.java:956)

这是打印的值Enc(只是其中的一部分)

TAtYyypIcW2kGWWKWRM1PWYCgi55hVnUqBv3Ze0c93R8tlUykr22xqeTLesPVlyepJv94ME/5JLQ

2 个答案:

答案 0 :(得分:1)

你的问题是你的密码越来越大。

假设salt是5个字符且值为10个字符,则每次迭代至少需要以下内存量:

  • 初始迭代的10个字节(值)+ 5个字节(盐)
  • 第二次迭代的20个字节(base64编码)+5个字节(salt)
  • 第三次迭代的32字节(base64编码)+ 5字节(salt)
  • 第四次迭代的48字节(base64编码)+ 5字节(salt)
  • 第五次迭代的72字节(base64编码)+5字节(salt)

如你所见,你的记忆力增长速度超乎想象。您的问题是AES会加密该值,而散列将始终保持相同的大小(例如,散列后SHA-256将始终为256位)。

因此,在我看来,你正在使用错误的工具并用此创建内存泄漏。

答案 1 :(得分:0)

可能是因为密文的值越来越大,而且它没有存储在encValue变量中。密文中的大量字符占用了大量内存,导致OutOfMemory错误。