[英]Is Cipher thread-safe?
很簡單, javax.crypto.Cipher
一個實例(例如Cipher.getInstance("RSA")
)是否可以從多個線程中使用,或者我是否需要將其中的多個粘貼到ThreadLocal
(在我的情況下)?
即使密碼是線程安全的,從多個線程並發使用它也不會真正有用。
您放入和從 Cipher 中取出的字節(通過它的update
和finish
方法)是一個連續的流。 這意味着,另一方面,它們必須以相同的順序傳遞才能有意義。 如果您只有一個線程執行此操作,則這是最容易實現的。
如果您使用多個線程,您通常希望在調用之間調用reset
- 然后無論如何您都需要外部同步。
我不會在沒有同步的情況下使用來自多個線程的 Cipher 對象。 當您查看 API 時,有些方法只能通過更改內部狀態來工作,例如init()
和update()
。 這使它們隱式地非線程安全。
密碼不是線程安全的。
如果您使用多線程來提高性能並且不想進行同步,則可以使用 Jasypt ( http://www.jasypt.org/general-usage.html ),它具有池化加密器:PooledPBEByteEncryptor、PooledPBEStringEncryptor。
如果同步適合您並且您使用 Spring。 您可以使用加密器( https://docs.spring.io/spring-security/site/docs/4.2.5.RELEASE/apidocs/org/springframework/security/crypto/encrypt/Encryptors.html )。 他們在內部進行同步以訪問 Cipher。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.