2014-09-05 18 views
3

詢問方法KeyPairGenerator.initialize()需要一個SecureRandom實例,它初始化很昂貴。 Java Doc沒有提到它是線程安全的。我所能找到的是a comment in the source code。難道這取決於實際創建的KeyPairGenerator實例嗎?順便說一下,我正在使用Sun RSA實例。KeyPairGenerator.generateKeyPair()線程安全嗎?

+0

您找到的代碼似乎含有您的答案 – ControlAltDel 2014-09-05 17:41:01

+0

*可以安全地假設「我們不知道」? – hd1 2014-09-05 19:04:04

回答

1

確實取決於創建的實際實例,軸突,正如你猜測的那樣。注意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做正確的事情!