Безопасен ли Bouncy Castle API?

Является Bouncy Castle API Thread Safe? В частности,

org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher
org.bouncycastle.crypto.paddings.PKCS7Padding
org.bouncycastle.crypto.engines.AESFastEngine
org.bouncycastle.crypto.modes.CBCBlockCipher

Я планирую написать singleton Spring bean для поддержки криптографии основного уровня в моем приложении. Поскольку это веб-приложение, есть больше шансов, что несколько потоков обращаются к этому компоненту за раз. Поэтому безопасность протектора здесь важна.

Пожалуйста, дайте мне знать, если вы столкнулись с такими ситуациями, используя Bouncy Castle.

Ответ 1

На самом деле не имеет значения, является ли API/код потокобезопасным. CBC-шифрование само по себе не является потокобезопасным. Некоторая терминология -

E(X) = Enctrypt message X
D(X) = Dectrypt X. (Note that D(E(X)) = X)
IV = Initialization vector. A random sequence to bootstrap the CBC algorithm
CBC = Cipher block chaining.

На самом деле простая реализация CBC может выглядеть так: P1, P2, P3 = Обычные текстовые сообщения

1. Generate an IV, just random bits.
2. Calculate E( P1 xor IV) call this C1
3. Calculate E( P2 xor C1) call this C2
4. Calculate E( P3 xor C2) call this C3.

Как вы можете видеть, результат шифрования P1, P2 и P3 (в указанном порядке) отличается от шифрования P2, P1 и P3 (в этом порядке).

Итак, в реализации CBC порядок важен. Любой алгоритм, где порядок важен, по определению не может быть потокобезопасным.

Вы можете создать Singleton factory, который предоставляет объекты шифрования, но вы не можете доверять им, чтобы они были потокобезопасными.

Ответ 2

Версия J2ME не является безопасной по потоку.