java - KeyPairGenerator.generateKeyPair() 线程安全吗?

标签 java multithreading

询问 KeyPairGenerator.initialize() 方法需要一个 SecureRandom 实例,它的初始化成本很高。 Java Doc 没有提到它是线程安全的。我能找到的就是a comment in the source code .会不会是它取决于实际创建的 KeyPairGenerator 实例?顺便说一下,我使用的是 Sun RSA 实例。

最佳答案

确实取决于创建的实际实例,神经突,如您推测的那样。重要的是要注意 KeyPairGenerator 类是抽象的,实现子类会覆盖 generateKeyPair 方法。因此,抽象类 KeyPairGenerator 的作者不能声称它是线程安全的。他们所能做的就是确保他们没有做任何损害线程安全的事情。

使用静态 getInstance 方法获取 KeyPairGenerator 的标准方法返回从 KeyPairGenerator 派生的类的实例:请参阅 KeyPairGenerator.Delegate 类。它的 generateKeyPair 实现也不会损害线程安全性,因此如果您以这种方式获取 KeyPairGenerator,则没有问题。但您也可以获得这样的 KeyPairGenerator:

    KeyPairGenerator kpg=new KeyPairGenerator("RSA"){
        @Override
        public KeyPair generateKeyPair(){
            return doSomethingThatIsntThreadSafe();
        }
    };

当然,您永远不会这样做,但 KeyPairGenerator 的作者无法知道这一点,因此他们无法告诉您 KeyPairGenerator 的任何实例都是线程安全的。

fine 意味着依赖于您的加密 SPI 来做正确的事情!

关于java - KeyPairGenerator.generateKeyPair() 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25691151/

相关文章:

java - 如何将jsp select标签中的值存储到input标签中

java - 使用 Java 的回文测试器,忽略空格和标点符号

java - Spring Batch 多线程数据库读取器

c++ - 如何在最小化每秒更新影响的同时存储和推送模拟状态?

c# - 如何管理 ThreadPool 中的项目?

java - Android 应用程序在导出到 apk 后获取 ClassNotFoundException

java - 此方法签名中的省略号 (...) 是什么?

java - 如何在我的应用程序中启动 Android 应用程序? (提供示例)

java - 如何在Kafka中使用多线程

java - 如何在Java中自定义ThreadFactory的所有子线程的名称?