2014-09-05 4 views
3

Спрашивая, как метод KeyPairGenerator.initialize() принимает пример SecureRandom, который стоит дорого инициализировать. Java Doc ничего не говорит о том, что он является потокобезопасным. Все, что я могу найти, это a comment in the source code. Может быть, это зависит от фактического экземпляра KeyPairGenerator? Кстати, я использую экземпляр Sun RSA.Является ли KeyPairGenerator.generateKeyPair() потоком безопасным?

+0

Исходный код, который вы нашли, кажется, содержит ваш ответ – ControlAltDel

+0

* Может быть * == безопасно предположить, «мы не знаем»? – hd1

ответ

1

Это зависит от фактического экземпляра созданного, neurite, как вы догадались. Важно отметить, что класс KeyPairGenerator является абстрактным, а реализация подклассов переопределяет метод generateKeyPair. Таким образом, авторы абстрактного класса KeyPairGenerator не могут утверждать, что он потокобезопасен. Все, что они могут сделать, это убедиться, что они ничего не сделали, чтобы поставить под угрозу безопасность потоков.

Стандартный способ получения KeyPairGenerator с использованием статического метода getInstance возвращает экземпляр класса, производного от KeyPairGenerator: см. Класс KeyPairGenerator.Delegate. Его реализация generateKeyPair также не делает ничего, чтобы поставить под угрозу безопасность потоков, поэтому, если вы получите свой KeyPairGenerator таким образом, вы в порядке . Но вы также можете получить KeyPairGenerator так:

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

Теперь, конечно, вы бы никогда не сделал этого, но авторы KeyPairGenerator не могут знать, что, таким образом, они не могут сказать вам, что любой экземпляр KeyPairGenerator является потокобезопасным.

† где штраф означает, что в зависимости от вашей криптографии SPI, чтобы сделать правильную вещь!

Смежные вопросы