我们开发了一个应用程序来加密/解密来自/到服务器的请求/响应。我们正在进行性能测试 加密/解密应用程序,我们观察到加密/解密过程需要时间,而许多线程 正在同时做这件事。为了识别问题,我们记录了加密/解密过程中的每个方法。 从记录器中我们发现,密钥提取过程占整个过程时间的70-80%。
进一步分析,我们发现Key store在内部使用HashTable。这会给性能问题吗?
当密钥店大小为2002时 - TPS为85 钥匙商店的大小是14007 - TPS是38
请帮忙。
答案 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
希望这会有所帮助..