KeyGenerator线程安全吗?

问题描述 投票:6回答:1

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

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

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

java multithreading cryptography thread-safety
1个回答
6
投票

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

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


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

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


来源摘要:

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

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

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


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

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

© www.soinside.com 2019 - 2024. All rights reserved.