0

在我的程序中,我试图用 AES 加密纯文本,至少进行 50 次迭代。但问题是我收到了 OutOfMemory 错误。从帖子中,推荐的迭代次数......我知道 LastPass 使用了 100,000 次迭代。但是我什至不能为 AES 使用 50 次迭代。

这是代码,

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;
    }

我知道 usingBase64Encoder会发出警告。所以请不要发布有关它的信息。我稍后会改变它。

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

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

这是异常日志,

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
4

2 回答 2

1

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

假设 salt 是 5 个字符并且您的值是 10 个字符,那么每次迭代至少需要以下内存量:

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

如你所见,你的记忆会比想象的增长得更快。您的问题是 AES 对值进行加密,而散列将始终保持相同的大小(例如,散列后 SHA-256 将始终为 256 位)。

因此,在我看来,您使用了错误的工具并由此造成了内存泄漏。

于 2013-07-01T12:16:51.293 回答
0

这可能是因为密文的值不断增加,并且没有存储在encValue变量中。密文中的大量字符占用了大量内存并导致OutOfMemory错误。

于 2013-07-01T12:35:58.873 回答