簡體   English   中英

密碼線程安全嗎?

[英]Is Cipher thread-safe?

很簡單, javax.crypto.Cipher一個實例(例如Cipher.getInstance("RSA") )是否可以從多個線程中使用,或者我是否需要將其中的多個粘貼到ThreadLocal (在我的情況下)?

不,不是。 實例是有狀態的。 所以你需要將它存儲在線程本地,或者在每次加密/解密調用時獲取一個新實例,或者將它包裝在一個synchronized(cipher)塊中。

線程安全通常在 javadocs 中被稱為“ 是線程安全的”或“ 不是線程安全的”。 這不是Cipher的情況,所以你不應該假設它是線程安全的。

即使密碼是線程安全的,從多個線程並發使用它也不會真正有用。

您放入和從 Cipher 中取出的字節(通過它的updatefinish方法)是一個連續的流。 這意味着,另一方面,它們必須以相同的順序傳遞才能有意義。 如果您只有一個線程執行此操作,則這是最容易實現的。

如果您使用多個線程,您通常希望在調用之間調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM