KeyPairGenerator.generateKeyPair() 方法是否线程安全?

8

询问KeyPairGenerator.initialize()方法需要一个昂贵的初始化SecureRandom实例。Java Doc没有提到它是否线程安全。我只能在源代码中找到一条注释。它可能取决于实际创建的KeyPairGenerator实例吗?顺便说一下,我正在使用Sun RSA实例。


你找到的代码源似乎包含了你的答案。 - ControlAltDel
“Could be” == 安全假设,“我们不确定”? - hd1
1个回答

4

正如您所猜测的那样,它确实取决于实际创建的实例neurite。需要注意的是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来正确执行!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接