解
- 消息摘要=>每当需要
- 的KeyFactory =>使用单个共享实例
- 的SecureRandom =>使用StackObjectPool创建新实例
- 密码=>使用StackObjectPool
我面对一个普通的dilemna而编码安全框架:“到池或不池”泳池或不游泳池的Java加密服务提供商
基本上这个问题是在两个“团”分为:
组1:
SecureRandom
,因为对nextBytes(...)
的呼叫被同步,并且它可能成为WebApp /多线程应用的瓶颈组2:加密服务提供商,如
MessageDigest
,Signature
,Cipher
,KeyFactory
,...
(因为getInstance()
的成本是多少?)你是什么看法?
你在这些问题上的习惯是什么?
编辑2013年9月7日
我终于抽出时间由我自己来测试@Qwerky Share
类,我觉得结果很令人吃惊......。
该课程缺乏我主要关心的问题:池类似GenericObjectPool或StackObjectPool。
所以我已经修改了类来测试所有4个备选方案:
我不得不将循环次数降低到100000次,因为1M会花费太多时间处理池。
我还在每个循环的末尾添加了一个Thread.yield()
以使负载具有更好的形状。
结果(累积性运行时):
- 消息摘要
- 新的实例:420秒
- 单实例:550章第
- StackObjectPool:800小号
- GenericObjectPool:1900小号
- 个的KeyFactory
- 新的实例:400S
- 单实例:350小号
- StackObjectPool:2900小号
- GenericObjectPool:3500小号
- SecureRandom的
- StackObjectPool:1600小号
- 新实例:2300小号
- GenericObjectPool:2300S
- 单实例:2800
- 密码
- StackObjectPool:2800
- GenericObjectPool:3500小号
- 单实例:5100小号
- 新实例:8000 s
结论
对于消息摘要和的KeyFactory,池PERF杀手,而且比用同步的瓶颈单个实例更糟糕,而他们当它涉及到的SecureRandom和密码
重复使用归结为昂贵创建和同步访问的开销之间的折衷。只有您可以选择,并取决于您的使用情况。请注意,两组之间没有区别,如果共享线程之间的实例,则必须同步访问“MessageDigest”等。 – Qwerky
当然@Qwerky任何选项都需要线程/使用块之间的同步。问题在于你如何在应用程序中处理thoses类? – Cerber
这真是太棒了---我希望这样的信息更容易适用于各种课程。真的,我希望它是在标准的Javadoc。 –