Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 密码线程安全吗?_Java_Multithreading_Thread Safety_Encryption - Fatal编程技术网

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():“请注意,当一个密码对象被初始化时,它会丢失以前获取的所有状态。换句话说,初始化密码相当于创建该密码的新实例并初始化它。”