And*_*niy 6 java multithreading cryptography thread-safety
我想知道我是否只能实例化javax.crypto.KeyGenerator一次,然后在多线程环境中使用此实例.
它的JavaDoc文档没有说明它的线程安全性.或者使用ThreadLocal<KeyGenerator>方法会更好?
更新:一个相关的问题是SecureRandom线程是否安全? 虽然JavaDoc没有声明该类是线程安全的,但是社区仍然认为它是线程安全的,从实际的角度来看这是非常重要的.我想知道KeyProvider的相同内容.
除非文档明确保证线程安全,否则将任何内容视为不是线程安全的.
你是对的这个哲学对于线程安全文档的稀缺性几乎没有帮助......但是如果没有文档保证线程安全,那么你根本就不能假设某些东西是或将继续是线程安全的.
这里有一些关于实际实现的研究KeyGenerator以及为什么我们不能假设它是线程安全的
我找到了源代码,乍看之下,当前的实现似乎是线程安全的.但是,即使我们假设这个实现永远不会改变,它也可以调用Security Providers它们自己的任何实现,也不能保证是线程安全的,因为文档没有说明它.
来源摘要:
调用generateKey()使用"Key Generator Service Provider"调用KeyGeneratorSpi.engineGenerateKey() (可能是线程不安全的)来生成SecretKey.
如果您KeyGenerator使用特定提供程序tehn构建它,它将使用该特定提供程序生成密钥.
如果您没有KeyGenerator使用特定提供程序构造,那么nextSpi()将通过JVMs可用提供程序列表进行迭代(线程安全),并尝试生成密钥,直到一个工作或您用完提供程序.
重点是文档 ......如果文档没有提及线程安全性,那么任何当前的实现者或对当前实现的更新可能都不是线程安全的.
所以你根本无法假设或依赖任何线程安全KeyGenerator.