我正在使用 AES 来完成对称 key 加密。
我将 key 存储在受密码保护的 KeyStore 中。
api 公开以下内容以从 keystore 加载 key
keyStore.load(inputStream, keyStorePassword.toCharArray());
所以每次当我想加密或解密时,我都必须传递输入流,这在我看来至少是性能下降,因为它具有 每次都重新阅读内容。
你能帮我解决将它存储在内存中然后访问它并转换为 InputStream 的策略吗?
注意:
我确实尝试将 keystore 的内容读取为字符串(UTF-8)并将其转换为 InputStream 并将其传递给 api。但它在以下异常后吐出
java.io.IOException: Invalid keystore form
最佳答案
KeyStore 是某种二进制格式。将其转换为 UTF-8 字符串是不好的。您可以使用 ByteArrayInputStream
它使用字节缓冲区。
但是 : 在我看来,性能优化不算数。您应该进行一些分析以检查这是否真的影响性能。因为它不应该。操作系统也会缓存,如果在此期间没有更改,很可能不会一遍又一遍地从磁盘读取相同的文件。程序员通常非常不擅长判断程序的哪些部分是性能 pig ,哪些不是。
另外:密码通常是通过 char
提供的,这是有原因的。数组:您可以完全控制数组的内容,并且可以在不再需要时将其清除。密码应尽可能短地保留在内存中。你没有那种对简单字符串的控制(你不知道它们何时被垃圾收集)。
关于java - 缓存 KeyStore 的内容并将其转换为 InputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3510580/