在我的程序中,我尝试使用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
答案 0 :(得分:1)
你的问题是你的密码越来越大。
假设salt是5个字符且值为10个字符,则每次迭代至少需要以下内存量:
如你所见,你的记忆力增长速度超乎想象。您的问题是AES会加密该值,而散列将始终保持相同的大小(例如,散列后SHA-256将始终为256位)。
因此,在我看来,你正在使用错误的工具并用此创建内存泄漏。
答案 1 :(得分:0)
可能是因为密文的值越来越大,而且它没有存储在encValue
变量中。密文中的大量字符占用了大量内存,导致OutOfMemory
错误。