web-dev-qa-db-fra.com

Le chiffrement est-il sécurisé pour les threads?

Tout simplement, une instance de javax.crypto.Cipher (Par exemple Cipher.getInstance("RSA")) peut-elle être utilisée à partir de plusieurs threads, ou dois-je en coller plusieurs dans un ThreadLocal (dans mon cas )?

58
Bart van Heukelom

Non, ça ne l'est pas. L'instance est avec état. Vous devez donc le stocker threadlocal, ou obtenir une nouvelle instance à chaque appel de chiffrement/déchiffrement, ou l'encapsuler dans un bloc synchronized(cipher).

Threadsafety est généralement explicitement mentionné dans javadocs. Ce n'est pas le cas pour Cipher , vous ne devez donc pas supposer qu'il est threadsafe.

90
BalusC

Même si un chiffrement était compatible avec les threads, il ne serait pas vraiment utile de l'utiliser simultanément à partir de plusieurs threads.

Les octets que vous insérez et retirez du Cipher (via ses méthodes update et finish) sont un flux continu. Cela signifie, à l'autre extrémité, qu'ils doivent être passés dans le même ordre pour avoir un sens. Ceci est plus facile à réaliser si vous n'avez qu'un seul thread pour cela.

Si vous utilisez plusieurs threads, vous voudrez généralement appeler reset entre les appels - et vous aurez quand même besoin d'une synchronisation externe.

7
Paŭlo Ebermann

Je n'utiliserais pas d'objets Cipher de plusieurs threads sans synchronisation. Lorsque vous regardez l'API, il existe des méthodes qui ne peuvent fonctionner qu'en changeant l'état interne, telles que init() et update(). Cela les rend implicitement non thread-safe.

7
ddso

Le chiffrement n'est pas sûr pour les threads.

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 a regroupé des chiffreurs: PooledPBEByteEncryptor, PooledPBEStringEncryptor.

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

2
Anton Yuriev