Является ли шифр поточно-ориентированным? - PullRequest
53 голосов
/ 05 августа 2011

Проще говоря, можно ли использовать один экземпляр javax.crypto.Cipher (например, Cipher.getInstance("RSA")) из нескольких потоков или мне нужно вставить несколько из них в ThreadLocal (в моем случае)?

Ответы [ 4 ]

87 голосов
/ 05 августа 2011

Нет, это не так. Экземпляр с состоянием. Поэтому вам нужно хранить его локально, или получать новый экземпляр при каждом вызове шифрования / дешифрования, или обернуть его в блок synchronized(cipher).

Потокобезопасность обычно явно упоминается в javadocs. Это не относится к Cipher, поэтому не следует считать его безопасным для потоков.

7 голосов
/ 05 августа 2011

Даже если шифр является поточно-ориентированным, было бы нецелесообразно использовать его из нескольких потоков одновременно.

Байты, которые вы вводите и извлекаете из Шифра (с помощью его методов update и finish), являются непрерывным потоком. Это означает, что, с другой стороны, они должны быть переданы в том же порядке, чтобы иметь какой-либо смысл. Это проще всего сделать, если у вас есть только один поток.

Если вы используете несколько потоков, вам обычно нужно звонить reset между вызовами - и тогда вам все равно потребуется внешняя синхронизация.

7 голосов
/ 05 августа 2011

Я бы не использовал объекты Cipher из нескольких потоков без синхронизации. Когда вы смотрите на API, есть методы, которые могут работать только при изменении внутреннего состояния, такие как init() и update(). Это делает их неявно не защищенными от потоков.

2 голосов
/ 11 октября 2018

Шифр ​​не является потокобезопасным.

Если вы используете многопоточность для производительности и не хотите выполнять синхронизацию, вы можете использовать Jasypt (http://www.jasypt.org/general-usage.html), у него есть объединенные шифры: PooledPBEByteEncryptor, PooledPBEStringEncryptor.

Если синхронизациянормально, вы используете Spring. Вы можете использовать Encryptors (https://docs.spring.io/spring-security/site/docs/4.2.5.RELEASE/apidocs/org/springframework/security/crypto/encrypt/Encryptors.html). Они выполняют внутреннюю синхронизацию для доступа к Cipher.

...