java - 缓存 KeyStore 的内容并将其转换为 InputStream

标签 java security caching keystore

我正在使用 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/

相关文章:

java - 关于控制台中单独显示的行

java - BasicDataSource 无法解析为类型

java - Android 运行时 : FATAL exception java. lang.NullPointerException

c# - 使用 C# 开发 RSA SecurID

security - 为什么火谢帕德要杀死火羊?

javascript - 清除ubuntu上的phantomjs缓存

java - 如何将 spring mvc 应用程序打包到 jar 中?

java - ejb有关角色和身份验证的安全性问题

php - Laravel 5 清除 View 缓存

hibernate - Redis作为Hibernate二级缓存