61 votes

Le Cipher est-il à l'abri des fils de discussion ?

Tout simplement, est-ce qu'une instance de javax.crypto.Cipher (par exemple Cipher.getInstance("RSA") ) peuvent être utilisés à partir de plusieurs fils, ou dois-je en placer plusieurs dans un fichier ThreadLocal (dans mon cas) ?

105voto

BalusC Points 498232

Non, ce n'est pas le cas. L'instance est un état. Vous devez donc la stocker de manière threadlocal, ou obtenir une nouvelle instance à chaque appel de cryptage/décryptage, ou encore l'intégrer dans un fichier de type synchronized(cipher) bloc.

La sécurité des fils est généralement mentionnée dans les javadocs comme " est sans fil " ou " est no sans fil ". Ce n'est pas le cas pour Cipher Vous ne devez donc pas supposer qu'il est à l'abri des fils.

9voto

Paŭlo Ebermann Points 35526

Même si un Cipher était thread-safe, il ne serait pas vraiment utile de l'utiliser à partir de plusieurs threads simultanément.

Les octets que vous introduisez dans le Cipher et que vous en retirez (par l'intermédiaire de son update y finish ) sont un flux continu. Cela signifie qu'à l'autre bout, elles doivent être passées dans le même ordre pour avoir un sens. C'est plus facile à réaliser si vous n'avez qu'un seul fil d'exécution.

Si vous utilisez plusieurs threads, vous voudrez généralement appeler reset entre les appels - et vous aurez alors besoin d'une synchronisation externe de toute façon.

7voto

dosendoc Points 1197

Je n'utiliserais pas les objets Cipher à partir de plusieurs threads sans synchronisation. Lorsque vous regardez l'API, il y a des méthodes qui ne peuvent fonctionner qu'en changeant l'état interne, telles que init() y update() . Cela les rend implicitement non sécurisés par les threads.

1 votes

Extrait de JavaDocs pour Cipher init() : "Notez que lorsqu'un objet Cipher est initialisé, il perd tous les états précédemment acquis. En d'autres termes, initialiser un Cipher est équivalent à créer une nouvelle instance de ce Cipher et à l'initialiser." docs.oracle.com/javase/7/docs/api/javax/crypto/

0 votes

Bien dit @ddso

4voto

Anton Yuriev Points 133

Cipher n'est pas thread safe.

Si vous utilisez le multithreading pour les performances et que vous ne voulez pas faire de synchronisation, vous pouvez utiliser Jasypt ( http://www.jasypt.org/general-usage.html ), il dispose de crypteurs groupés : PooledPBEByteEncryptor, PooledPBEStringEncryptor.

Si la synchronisation vous convient et que vous utilisez Spring. Vous pouvez utiliser les Encryptors ( https://docs.spring.io/spring-security/site/docs/4.2.5.RELEASE/apidocs/org/springframework/security/crypto/encrypt/Encryptors.html ). Ils font de la synchronisation en interne pour accéder au Cipher.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X