【问题标题】:Cache the contents of KeyStore and convert it to a InputStream缓存 KeyStore 的内容并将其转换为 InputStream
【发布时间】:2010-08-18 09:19:15
【问题描述】:

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

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

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

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

谁能帮我解决将其存储在内存中的策略,然后再访问它并转换为 InputStream 吗?

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

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

【问题讨论】:

    标签: java security caching keystore


    【解决方案1】:

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

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

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

    【讨论】:

    • +1。这看起来确实像是 OP 的过早优化,维护密钥库内容的缓存确实不是一个好主意。
    【解决方案2】:

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

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

    【讨论】:

    • 好吧,因为我找到了解决方案,所以我发布了它。我没有看到任何伤害,也没有看到我的帖子的任何部分违反了 stackoverflow 规则。
    猜你喜欢
    • 2018-12-12
    • 2020-09-28
    • 2012-08-04
    • 2017-07-27
    • 2018-11-13
    • 2010-09-08
    • 1970-01-01
    • 2013-09-18
    • 2014-04-23
    相关资源
    最近更新 更多