如何从内存中销毁和清除字符串变量内容?

时间:2016-02-07 05:37:16

标签: c# vb.net string security memory-management

从内存中删除所有字符串变量跟踪的安全方法是什么? 我已经知道SecureString类的用法,但有时需要从外部源导入或处理数据,而且大多数都使用字符串;这是一个例子:

    Dim decrypted_data() As Byte = Decrypt(...)
    Dim temp As String = System.Text.UTF8Encoding.UTF8.GetString(decrypted_data)
    Dim sec As SecureString = GetSecureString(temp)
    ' Now I should remove temp contents from memory

或者在我的示例中更好的解决方案是直接将加密数据写入SecureString的想法,但我不知道怎么可能。

1 个答案:

答案 0 :(得分:-3)

最后我这样做了:

<System.Runtime.CompilerServices.Extension()> _
Public Sub ZeroFree(ByRef str As String)
    If String.IsNullOrEmpty(str) Then
        Return
    End If
    If String.IsInterned(str) IsNot Nothing Then
        ' Throw New Exception("Interned strings are not supported!")
        Return
    End If
    Dim gch As GCHandle = GCHandle.Alloc(str, GCHandleType.Pinned)
    ZeroMemory(gch.AddrOfPinnedObject, str.Length * 2 - 1)
    gch.Free()
    str = Nothing
End Sub

Public Sub ZeroMemory(ByVal location As IntPtr, ByVal size As Integer)
    For i As Integer = 0 To size
        Marshal.WriteByte(IntPtr.Add(location, i), 0)
    Next
End Sub

来自评论:

注意:这是我能找到的解决此问题的最佳解决方案,但它不是通用或100%解决方案,并且在特殊情况下不起作用,例如它不清楚副本字符串,如果之前由垃圾收集器自动复制。
欢迎提出更多想法或有用的建议!