2009-11-17 54 views
0

比方说我们有这样的代码运行在构造函数中:线程安全RijndaelManaged,ICryptoTransform.TransformFinalBlock?

Dim initVectorBytes As Byte() = System.Text.Encoding.ASCII.GetBytes(initVector) 
    Dim saltValueBytes As Byte() = System.Text.Encoding.ASCII.GetBytes(saltValue) 

    Dim passPharse As String = GenerateKeyString(EncryptionKey) 

    Dim password As Rfc2898DeriveBytes = New Rfc2898DeriveBytes(passPharse, saltValueBytes, passwordIterations) 

    Dim keyBytes As Byte() = password.GetBytes(CInt(keySize/8)) 

    mSymmetricKey = New RijndaelManaged() 
    mSymmetricKey.Padding = PaddingMode.PKCS7 

    mSymmetricKey.Mode = CipherMode.CBC 
    mSymmetricKey.BlockSize = 128 

    mSymmetricKey.Key = keyBytes 
    mSymmetricKey.IV = initVectorBytes 

    mDecryptor = mSymmetricKey.CreateDecryptor() 
    mEncryptor = mSymmetricKey.CreateEncryptor() 

,然后2个公共功能:

Public Function Encrypt(ByVal plainText As String) As String 
    Dim plainTextBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(plainText) 
    Dim cipherTextBytes As Byte() = mEncryptor.TransformFinalBlock(plainTextBytes, 0, plainTextBytes.Length) 

    Dim cipherText As String = Convert.ToBase64String(cipherTextBytes) 

    Return cipherText 
End Function 
Public Function Decrypt(ByVal cipherText As String) As String 
    Dim cipherTextBytes As Byte() = Convert.FromBase64String(cipherText) 

    Dim plainTextBytes As Byte() = mDecryptor.TransformFinalBlock(cipherTextBytes, 0, cipherTextBytes.Length) 

    Dim plainText As String = System.Text.Encoding.UTF8.GetString(plainTextBytes, 0, plainTextBytes.Length) 

    Return plainText 
End Function 

难道是线程安全的调用这些从多个线程?

回答

2

根据文档,它不是线程安全的。您将在mDecryptormEncryptor变量中有RijndaelManagedTransform实例。 TransformFinalBlock是根据MSDN不是线程安全实例方法:

任何公共静态此类型的成员(在Visual Basic中的Shared)都是线程 安全的。任何实例成员不是 保证是线程安全的。

如果你想保证有一个线程安全代码,你可能需要将调用同步到TransformFinalBlock方法。

+0

谢谢,我希望我错过了一些东西,我想不正是使用[ThreadStatic]来解决问题... – Peter 2009-11-17 10:41:06