作为KeyPairGenerator.initialize()
方法询问,需要一个SecureRandom
实例,该实例初始化起来很昂贵。 Java Doc没有提及任何有关线程安全的内容。我只能找到a comment in the source code。可能取决于所创建的实际KeyPairGenerator
实例吗?顺便说一句,我正在使用Sun RSA实例。
最佳答案
正如您推测的那样,它确实取决于创建的实际实例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的任何实例都是线程安全的。
†在这里,好的意思是取决于您的加密SPI来做正确的事情!