2013-07-01 17 views
0

在我的程序中,我尝试使用AES进行至少50次迭代的纯文本加密。但问题是我得到OutOfMemory错误。从帖子,Recommended # of iterations....我知道LastPass使用100,000次迭代。但是我甚至无法使用AES的50次迭代。更多AES迭代导致OutOfMemory Java堆空间

下面是代码,

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) 

这里是印刷valueEnc(只是其中的一部分)

TAtYyypIcW2kGWWKWRM1PWYCgi55hVnUqBv3Ze0c93R8tlUykr22xqeTLesPVlyepJv94ME/5JLQ 
+0

你确定这是给你一个OOM吗? –

+0

我每次执行都得到它。 6次可能!不知道有多少次:( – user12458

+0

为什么你要多次使用AES?AES是一个对称密码,应该足够安全地使用一次。你链接的问题是关于散列,它有意义的散列值时间来减慢攻击者的速度 –

回答

0

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

1

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

假设盐为5个字符和您的值是10个字符,至少需要的存储器为每次迭代以下量:

  • 10个字节(值)+ 5个字节(盐)用于初始迭代
  • 20个字节(64位编码)+ 5个字节(盐),用于第二次迭代
  • 32个字节(64位编码)+ 5个字节(盐),用于第三次迭代
  • 48个字节(64位编码)+ 5字节(盐)第四次迭代
  • 72字节(64位编码)+ 5个字节(盐)第五次迭代

当你看到你的记忆将增长比想象的要快。你的问题是AES加密了这个值,而散列值一直保持相同的大小(例如SHA-256在散列之后总是256位)。

所以在我的眼中,你使用了错误的工具,并用此创建了内存泄漏。