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线程安全吗?的主要内容,如果未能解决你的问题,请参考以下文章