我打算在 spring bean 中将它用作静态字段,并在 post 构造方法中初始化它。
服务类将注入(inject)此加密 bean 并调用它公开的方法以使用密码 (javax.crypto.Cipher) 加密字符串(密码将使用 SecretKeySpec 初始化)。

注意:每次在加密字符串方法中都会获取一个新的密码实例。

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

最佳答案

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

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

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

关于java - javax.crypto.spec.SecretKeySpec 线程安全吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62089404/

10-10 04:15