0

我有以下代码:

Public Shared Function Crypt(text As String) As String
    If text <> "" Then
        Dim cryptoProvider As New DESCryptoServiceProvider()
        Dim ms As New MemoryStream()
        Dim cs As New CryptoStream(ms, cryptoProvider.CreateEncryptor(KEY_64, IV_64), CryptoStreamMode.Write)
        Dim sw As New StreamWriter(cs)

           sw.Write(text)
           sw.Flush()
           cs.FlushFinalBlock()
           ms.Flush()

        'convert back to a string
        Return Convert.ToBase64String(ms.GetBuffer(), 0, CInt(ms.Length))
    End If

    Return ""

End Function

在 Fortify 扫描后,他们报告我需要释放 cs CryptoStream 对象。

据我所知, FlushFinalBlock() 方法可以完成这项工作。

我也需要调用 disponse() 函数吗?或者可能是一个假阳性问题?

4

1 回答 1

1

任何实现IDisposable接口且仅在单个块范围内使用的对象都应使用Using语句创建。这样,就可以保证它被隐式地放置在Using块的末尾。即使Return语句被命中或抛出异常也适用。在您的情况下,您正在创建四个一次性对象。在创建每个对象或销毁每个对象之间不需要代码,因此您不需要多个嵌套Using块。您应该对它们都使用一个Using语句:

Using cryptoProvider As New DESCryptoServiceProvider(),
      ms As New MemoryStream(),
      cs As New CryptoStream(ms, cryptoProvider.CreateEncryptor(KEY_64, IV_64), CryptoStreamMode.Write),
      sw As New StreamWriter(cs)
    '...
End Using
于 2020-02-08T01:40:11.360 回答