Java 密码线程安全吗?
非常简单,可以从多个线程使用Java 密码线程安全吗?,java,multithreading,thread-safety,encryption,Java,Multithreading,Thread Safety,Encryption,非常简单,可以从多个线程使用javax.crypto.Cipher(例如Cipher.getInstance(“RSA”))的一个实例,还是需要在ThreadLocal中粘贴多个实例(在我的情况下)?不需要。实例是有状态的。因此,您需要将其存储为threadlocal,或者在每次加密/解密调用时获取一个新实例,或者将其包装在同步(密码)块中 线程安全在javadocs中通常被称为“或”。对于,情况并非如此,因此您不应假定它是线程安全的。如果没有同步,我不会使用来自多个线程的密码对象。当您查看AP
javax.crypto.Cipher
(例如Cipher.getInstance(“RSA”)
)的一个实例,还是需要在ThreadLocal
中粘贴多个实例(在我的情况下)?不需要。实例是有状态的。因此,您需要将其存储为threadlocal,或者在每次加密/解密调用时获取一个新实例,或者将其包装在同步(密码)
块中
线程安全在javadocs中通常被称为“或”。对于,情况并非如此,因此您不应假定它是线程安全的。如果没有同步,我不会使用来自多个线程的密码对象。当您查看API时,有些方法只能通过更改内部状态来工作,例如
init()
和update()
。这使得它们隐式地非线程安全。即使密码是线程安全的,从多个线程同时使用它也不会真正有用
您输入和输出密码的字节(通过其update
和finish
方法)是一个连续的流。这意味着,在另一端,它们必须以相同的顺序传递才能有意义。如果只有一个线程执行此操作,那么这是最容易实现的
如果使用多个线程,通常需要在调用之间调用重置,然后无论如何都需要外部同步。密码不是线程安全的 如果您使用多线程来提高性能,并且不想进行同步,那么可以使用Jasypt(),它具有池加密器:pooledpebytencryptor、PooledPBEStringEncryptor 如果同步对您来说是正常的,并且您使用Spring。您可以使用加密机()。它们在内部进行同步以访问密码。来自JavaDocs for Cipher init():“请注意,当一个密码对象被初始化时,它会丢失以前获取的所有状态。换句话说,初始化密码相当于创建该密码的新实例并初始化它。”