多线程在java中是Mac#doFinal()线程安全的吗?
在java中,我们需要为过多的文本数据生成HmacSHA1/256消息摘要,当然是并行的
现在的问题是javax.crypto.Mac#doFinal(byte[]:arg)
是线程安全的,还是sun/oracle(hotspot)实现的SPI更好
所有salt键都是相同的,我正在考虑准备一个Mac
obj,所有线程都调用它来生成消息摘要
我无法理解并用javadoc来陈述它
如果这个家伙不是线程安全的,那么有没有类似的东西(可能来自Apache,…)
谢谢
# 1 楼答案
所有
javax.crypto.Mac#doFinal
方法都不是线程安全的,因为它们会更改MAC的内部状态这是有道理的,因为在任何一点上的mac都类似于该点之前所有mac的总和/xor,所以它不能并行进行。据我所知,没有一种MAC算法可以并行工作(与某些加密算法相反)
如上所述,
Mac
是可克隆的,所以如果你有一个用salt初始化的实例,你可以克隆它并使用克隆来计算mac(不过我会测试这个!)