从内存中删除所有字符串变量跟踪的安全方法是什么?
我已经知道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的想法,但我不知道怎么可能。
答案 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%解决方案,并且在特殊情况下不起作用,例如它不清楚副本字符串,如果之前由垃圾收集器自动复制。
欢迎提出更多想法或有用的建议!