在Java中,我们需要为太多的文本数据生成HmacSHA1/256消息摘要,当然需要进行并行处理。
现在的问题是,javax.crypto.Mac#doFinal(byte[]:arg)
线程安全吗?或者说在sun/oracle(hotspot)的实现SPI中是否更好?
所有的盐密钥都是相同的,我考虑准备一个Mac
对象,并让所有线程调用它来生成消息摘要。
我无法理解并在javadoc中描述它。
如果这个方法不是线程安全的,是否有任何类似的替代方法(也许来自Apache等)?
谢谢。
在Java中,我们需要为太多的文本数据生成HmacSHA1/256消息摘要,当然需要进行并行处理。
现在的问题是,javax.crypto.Mac#doFinal(byte[]:arg)
线程安全吗?或者说在sun/oracle(hotspot)的实现SPI中是否更好?
所有的盐密钥都是相同的,我考虑准备一个Mac
对象,并让所有线程调用它来生成消息摘要。
我无法理解并在javadoc中描述它。
如果这个方法不是线程安全的,是否有任何类似的替代方法(也许来自Apache等)?
谢谢。
javax.crypto.Mac#doFinal
方法都不是线程安全的,因为它们会改变 MAC 的内部状态。
这是有道理的,因为在任何时候,MAC 都类似于到那个时间点所有先前 MAC 的总和/异或运算,所以它不能并行完成。就我所知,没有一种 MAC 算法可以并行工作(与某些加密算法相反)。
尽管如此,Mac
是可克隆的,所以如果您拥有已计算盐的实例,您可以克隆它并使用克隆来计算 MAC(但我建议测试一下!)
Mac
会在每个请求中复制所需的信息(数据、密钥)并生成它,这样它就是线程安全的(而静态方法则不是)。希望它有点像轮询,每个线程都有一个。谢谢 - user5207035