Методы проверки в java.security.cert.Certificate потокобезопасны? - PullRequest
3 голосов
/ 19 мая 2011

Как правило, методы проверки в java.security.cert.Certificate можно считать поточно-ориентированными? В частности, verify (ключ PublicKey) и verify (ключ PublicKey, строка sigProvider) . Могут ли несколько потоков вызывать эти методы одновременно, не беспокоясь о том, что они изменят внутренние данные небезопасным способом?

JavaDoc ничего не упоминает об этом. Возможно, это зависит от реализации?

Я хотел бы сделать что-то вроде этого:

Certificate certificate = getCertificateFromCache();
certificate.verify(whatever);

В идеале, не помещая его в синхронизированный блок.

Ответы [ 2 ]

3 голосов
/ 19 мая 2011

Certificate.verify - абстрактный метод. Таким образом, с этой точки зрения не может быть никакой гарантии, что все реализации всегда поточно-ориентированы. Возможно, документация по фактической реализации сертификата что-то говорит вам об этом, но для безопасности вам, возможно, придется синхронизировать вызов для проверки по фактическому сертификату.

Может быть, вы можете создать что-то вроде пула одинаковых экземпляров сертификатов, чтобы обойти эту проблему. Затем вы можете параллельно проверять разные экземпляры одного и того же сертификата.

0 голосов
/ 13 октября 2017

Глядя на sun.security.x509.X509CertImpl источник , он имеет несколько synchronized методов (включая verify) и поле private ConcurrentHashMap<String,String> fingerprints.

Так что мне кажется, что было намерение сделать его поточно-ориентированным.

К сожалению, synchronized методы, обновляющие внутренние поля состояния, такие как verificationResult, verifiedPublicKey, verifiedProvider, повлекут за собой некоторое снижение производительности при одновременном доступе из многих потоков.

Может быть эффективнее избежать synchronized блокирования конфликтов путем кэширования экземпляров в ThreadLocal, например.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...