Java Keystore是否存在性能问题?

时间:2016-07-19 10:55:40

标签: java performance security

我们开发了一个应用程序来加密/解密来自/到服务器的请求/响应。我们正在进行性能测试 加密/解密应用程序,我们观察到加密/解密过程需要时间,而许多线程 正在同时做这件事。为了识别问题,我们记录了加密/解密过程中的每个方法。 从记录器中我们发现,密钥提取过程占整个过程时间的70-80%。

  1. 我们使用AES算法进行加密/解密
  2. AES密钥存储在具有唯一ID的密钥存储区中。
  3. 在加密/解密过程之前,我们从密钥存储区获取针对唯一ID存储的AES密钥。执行加密/解密。
  4. 关键商店规模越来越大,性能越来越差。
  5. 进一步分析,我们发现Key store在内部使用HashTable。这会给性能问题吗?

    当密钥店大小为2002时 - TPS为85      钥匙商店的大小是14007 - TPS是38

    请帮忙。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

结论:不要每次都加载Java Keystore或密钥。它的设计不是一分钟内加载一次。

答案 1 :(得分:0)

我正面对这个问题......我已经在轰鸣声中回答了这个问题。

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

Jvm在内存中加载密钥库。它将哈希表集合作为内部存储。

Hashtable已同步。

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

密钥库使用哈希表,它是性能描述背后的根本原因。

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

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

希望这会有所帮助..