KeyGenerator线程安全吗?

时间:2017-12-06 16:05:23

标签: java multithreading cryptography thread-safety

我想知道我是否只能实例化javax.crypto.KeyGenerator一次,然后在多线程环境中使用此实例。

它的JavaDoc文档没有说明它的线程安全性。或者最好使用ThreadLocal<KeyGenerator>方法?

更新:相关问题为Is SecureRandom thread safe? 虽然JavaDoc没有声明该类是线程安全的,但是社区仍然认为 线程安全的决定从实际的角度来看是非常重要的。我想知道KeyProvider的相同内容。

1 个答案:

答案 0 :(得分:6)

除非文档明确保证线程安全,否则将任何内容视为线程安全

你说对了这个哲学对于线程安全文档的缺乏几乎没有帮助......但是如果没有文档保证线程安全,那么你就不能假设某些事情是或将继续是线程安全的。

以下是KeyGenerator实际实施的一些研究以及为什么我们不能假设它是线程安全的

我找到了the source,乍一看似乎当前的实现是线程安全的。但是,即使我们假设这个实现永远不会改变,它也会调用Security Providers,这可能是他们自己的任何实现,也不保证自己是线程安全的文档没有说明这一点。

来源摘要:

致电generateKey()使用密钥生成器服务提供商&#34;调用KeyGeneratorSpi.engineGenerateKey() (可能是线程不安全的)来生成SecretKey

如果您使用特定提供商tehn构建KeyGenerator,它将使用该特定提供商生成密钥。

如果您没有使用特定提供程序构造KeyGenerator,那么nextSpi()将通过可用提供程序的JVM列表进行迭代(线程安全)并尝试生成密钥,直到一个工作或您用完为止提供者..

重点是文档 ...如果文档没有提及线程安全性,那么任何当前的实现者或对当前实现的更新可能都不是线程安全的。

因此,您无法假设或依赖KeyGenerator的任何线程安全性。