KeyGenerator线程安全吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KeyGenerator线程安全吗?相关的知识,希望对你有一定的参考价值。

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

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

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

答案

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

你是对的这个哲学对于线程安全文档的稀缺性几乎没有帮助......但是如果没有文档保证线程安全,那么你根本就不能假设某些东西是或将继续是线程安全的。


这里有一些关于KeyGenerator实际实现的研究,以及为什么我们不能假设它是线程安全的

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


来源摘要:

调用generateKey()使用“密钥生成器服务提供商”调用KeyGeneratorSpi.engineGenerateKey()(可能是线程不安全的)来生成SecretKey

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

如果你没有用特定的提供者构造KeyGenerator,那么nextSpi()将通过JVMs可用提供者列表迭代(线程安全)并尝试生成密钥,直到一个工作或你用完提供者。


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

所以你根本不能假设或依赖KeyGenerator的任何线程安全。

以上是关于KeyGenerator线程安全吗?的主要内容,如果未能解决你的问题,请参考以下文章

markdown 线程安全相关片段

这个代码线程安全吗

多个请求是多线程吗

这段代码安全吗,可以从构造函数 C++ 生成线程吗?

此代码是从向量中添加和删除项目的线程安全方式吗?

javax.crypto.Cipher; javax.crypto.KeyGenerator;这两个类库在哪?