javax.crypto.spec.SecretKeySpec线程安全吗?

javax.crypto.spec.SecretKeySpec线程安全吗?,java,encryption,Java,Encryption,我打算在Springbean中将其用作静态字段,并在后期构造方法中初始化它。 服务类将注入这个加密bean并调用它公开的方法,以使用密码(javax.crypto.cipher)加密字符串(密码将使用SecretKeySpec初始化) 注意:每次在encrypt string方法中都将获取一个新的密码实例 编辑: 正如@Savior所指出的,字段(SecretKeySpec)不应表示为静态。如果SecretKeySpec是线程安全的,那么我将使其成为配置类中的bean,并将其注入加密bean(将

我打算在Springbean中将其用作静态字段,并在后期构造方法中初始化它。 服务类将注入这个加密bean并调用它公开的方法,以使用密码(javax.crypto.cipher)加密字符串(密码将使用SecretKeySpec初始化)

注意:每次在encrypt string方法中都将获取一个新的密码实例

编辑:
正如@Savior所指出的,字段(SecretKeySpec)不应表示为静态。如果SecretKeySpec是线程安全的,那么我将使其成为配置类中的bean,并将其注入加密bean(将其标记为私有final字段并通过构造函数注入)

是的,它是。原因很容易理解:没有方法(第一栏,见下文)可以更改
SecretKeySpec
实例的状态。换句话说,类通常是不可变的,即使在类描述中没有特别提到。根据定义,不可变类是线程安全的。实际上,大多数(如果不是全部的话)键实现通常是不可变的

有一种方法打破了不变性(我忘记了),那就是更新的方法。不过别担心,据我所知,
Cipher
或任何其他函数都不会调用它。此外,
SecretKeySpec
没有实现该方法(在OpenJDK版本14之前的版本中进行了检查)



正如注释中所指出的,您不应该将任何动态信息放入静态字段中。相反,只需共享一个引用。

可能与此类似:旁注:不要将Springbean作为静态字段,也绝对不要在post构造方法中初始化它。@akuzminykh感谢到该文章的链接。密码不是线程安全的,但是我想知道用于获取密码新实例的SecretKeySpec是否是线程安全的。是的,SecretKeySpec是线程安全的,原因很简单,它是不可变的。@PresidentJamesK.Polk几乎不可变,请参阅我的答案。。。这里有
可销毁的
界面…谢谢@Maarten Bodewes会投票,但没有足够的声誉。