Является ли javax.crypto.spe c .SecretKeySpe c потокобезопасным? - PullRequest
4 голосов
/ 29 мая 2020

Я намерен использовать его в компоненте Spring как поле c stati и инициализировать его внутри метода конструкции post. Класс обслуживания внедрит этот компонент шифрования и вызовет метод, предоставляемый им, для шифрования строки с помощью шифра (javax.crypto.Cipher) (шифр будет инициализирован с использованием SecretKeySpe c).

Примечание: новый экземпляр шифра будет извлекаться каждый раз в методе зашифрованной строки.

Изменить: как отметил @Savior, поле (SecretKeySpe c) не должно обозначаться как stati c. Если SecretKeySpe c является потокобезопасным, я сделаю его bean-компонентом в классе конфигурации и введу его в bean-компонент шифрования (пометив его как частное конечное поле и введу через конструктор)

1 Ответ

7 голосов
/ 29 мая 2020

Да, это так. Довольно легко понять, почему: нет методов (кроме одного, см. Ниже), которые изменяют состояние экземпляра SecretKeySpec. Другими словами, класс обычно неизменяем, даже если это специально не упоминается в описании класса. Неизменяемые классы по определению потокобезопасны. На самом деле, большинство, если не все реализации Key, обычно неизменяемы.

Есть один метод, который нарушает неизменяемость (о котором я забыл), и это более новый метод Key.destroy(). Не волнуйтесь, это не вызывается Cipher или какой-либо другой функцией, насколько мне известно. Кроме того, этот метод не реализован SecretKeySpec (проверено в OpenJDK до версии 14).


Как также отмечалось в комментариях, вы никогда не должны помещать какую-либо динамическую c информацию в stati c полей. Вместо этого просто поделитесь ссылкой.

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