【问题标题】:Java Keystore is giving performance issue? [duplicate]Java Keystore 出现性能问题? [复制]
【发布时间】:2016-07-19 10:55:39
【问题描述】:

我们开发了一个应用程序来加密/解密来自/到服务器的请求/响应。我们正在做性能测试 加密/解密应用程序,我们观察到加密/解密过程需要时间,而许多线程 正在同时做。为了确定问题,我们记录了加密/解密过程中的所有方法。 从记录器中我们发现,Key Fetching 过程占用了整个过程时间的 70-80%。

  1. 我们使用 AES 算法进行加密/解密
  2. AES 密钥存储在具有唯一 ID 的密钥库中。
  3. 在加密/解密过程之前,我们从密钥库中获取针对唯一 ID 存储的 AES 密钥并执行加密/解密。
  4. 随着密钥存储大小的增加,性能会越来越差。

进一步分析发现,Key store 内部使用的是 HashTable。这是给性能问题吗?

当密钥库大小为 2002 时 --- TPS 为 85 密钥库大小为 14007 -- TPS 为 38

请帮忙。

【问题讨论】:

  • 不是指安卓密钥库提供者!!参考 Java 密钥库
  • 当性能成为问题时,商店的规模是多少?请将此信息添加到问题中,而不是作为答案。
  • 这与@Kalpen Patel 的问题有关吗?如果是,请协调并删除其中一个问题

标签: java performance security


【解决方案1】:

注意:此答案基于假设,因为您没有提供有关使用的密钥库格式(JKS、BKS、JCEKS 等)的任何详细信息。

我假设每次需要密钥时,都会从文件(JKS 格式)加载 Java 密钥库。

密钥库受密码保护,即使您不使用它(空密码),密码字符串也会用于生成保护 Java 密钥库的加密密钥。

您的主要问题是密码的密钥派生过程包含反暴力算法,该算法对密码执行 1000 次或更多次 SHA1 迭代。这会消耗大量时间,这是为了减缓暴力攻击而存在的预期结果。

编辑:似乎 JKS 格式不仅在加载时执行此操作,而且在加载密钥时也执行此操作。

结论:不要每次都加载 Java Keystore 或密钥。它不能在一分钟内加载超过一次。

【讨论】:

  • 我们一直在使用 JKS。我们不是一直在加载密钥库。我们在启动时这样做。
  • 但是您每次都在加载密钥,这会触发密钥解密,并且您已经发现这会消耗大量时间。
  • 否,在应用程序启动时,我们将键加载到并发哈希映射中,然后永远使用该映射。所以 key 将从 hashmap 而不是 key store 中获取。
【解决方案2】:

我遇到了这个问题......我已经在下面的帖子中回答了这个问题。

与执行速度有关的问题因操作系统平台而异。

JVM 将密钥存储加载到内存中。并且它具有哈希表集合作为内部存储。

哈希表已同步。

每当您从密钥库执行获取操作时,它都会从内存中的密钥库而不是物理密钥库中返回它。您可以在 linux base OS 中使用 ("top" - %wa section) 命令确认。

密钥存储使用哈希表,这是性能下降的根本原因。

我通过在初始化项目时将所有密钥从密钥库加载到 ConcurrentHashMap 中解决了这个问题。以后,所有的读取操作都将从 MAP 而不是 keystore 执行。并确保所有写入操作都将在密钥库和 MAP 上执行。

Java Keystore.getKey() slow while Key store size Increase

希望这会有所帮助..

【讨论】:

    猜你喜欢
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 2011-12-06
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多