0

コンストラクターで実行される次のコードがあるとします。

    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

複数のスレッドからそれらを呼び出すことはスレッドセーフでしょうか?

4

1 に答える 1

2

ドキュメントによると、スレッドセーフではありません。および変数にRijndaelManagedTransformインスタンスがあります。TransformFinalBlockは、MSDN によるとスレッド セーフではないインスタンス メソッドです。mDecryptormEncryptor

この型の public static (Visual Basic では共有) メンバーはすべて、スレッド セーフです。インスタンス メンバーは、スレッド セーフであるとは限りません。

スレッド セーフなコードであることを保証したい場合は、TransformFinalBlock メソッドへの呼び出しを同期する必要がある場合があります。

于 2009-11-17T09:34:57.360 に答える