2

我正在使用 AES 来完成对称密钥加密。我将密钥存储在受密码保护的密钥库中。

该 api 公开以下内容以从密钥库加载密钥

keyStore.load(inputStream, keyStorePassword.toCharArray()); 

所以每次当我想加密或解密时,我都必须传递输入流,在我看来这至少会影响性能,因为它必须每次都重新读取内容。

任何人都可以帮助我将其存储在内存中并从那时起访问它并转换为 InputStream 的策略吗?

注意: 我确实尝试将密钥库的内容读取为字符串(UTF-8)并将其转换为 InputStream 并将其传递给 api。但它在异常之后吐出

java.io.IOException:无效的密钥库形式

4

2 回答 2

3

KeyStore 是某种二进制格式。将其转换为 UTF-8 字符串并不好。您可以使用ByteArrayInputStream使用字节缓冲区的 a 。

但是在我看来,在性能优化方面并不重要。您应该进行一些分析以检查这是否真的影响性能。因为不应该。操作系统也会缓存,如果同时没有更改,很可能不会一遍又一遍地从磁盘读取相同的文件。程序员通常非常不擅长判断程序的哪些部分是性能消耗者,哪些不是。

另外:密码通常通过char数组提供是有原因的:您可以完全控制数组的内容,并且可以在不再需要时清除它。密码应尽可能短地保留在内存中。你没有那种对简单字符串的控制(你不知道它们什么时候被垃圾收集)。

于 2010-08-18T09:39:51.667 回答
0

感谢您的回复。我完全赞成以下选择。

我会加载一次密钥库并提取 SecretKey 并分配给您正在使用的类的实例或类变量,然后在需要加密或解密时使用 SecretKey

于 2010-08-18T11:27:43.630 回答