我最近一直在为我的公司进行安全代码审查,并使用名为Fortify360的工具.它将识别代码的许多问题并描述问题.它提出的一个有趣的问题是我没有找到任何其他信息如下:
"存储在内存中的敏感数据(如密码)如果存储在托管的String对象中,可能会泄露.字符串对象没有固定,因此垃圾收集器可以随意重定位这些对象并在内存中留下几个副本.这些对象是默认情况下没有加密,因此任何可以读取进程内存的人都能看到内容.此外,如果进程的内存被换出到磁盘,则字符串的未加密内容将被写入交换文件. ,因为String对象是不可变的,所以只能通过CLR垃圾收集器从内存中删除String的值.除非CLR内存不足,否则不需要运行垃圾收集器,因此不能保证何时垃圾收集将发生.如果应用程序崩溃,应用程序的内存转储可能会泄露敏感数据."
所有这些我理解为很有道理,而且我对这个问题的研究非常标准.
问题是:我该如何解决这个问题?假设有问题的类不能从iDisposable继承(非常大的应用程序,并且在有问题的字符串之后很久就需要该类).是否有另一种手动内存管理方式来处理特定字符串而不调用垃圾收集器,GC.Collect()??
提前感谢您的帮助.
亚历克斯
我创建了以下函数,它将按要求执行(将HEX字符串转换为BitArray).我不确定函数的效率,但我现在的主要问题是Convert.ToInt64函数是特定于endian的.当将其移植到备用芯片组时,我们将得到不同的结果(或例外).所以有人能想到另一种方法来进行这种转换吗???
public BitArray convertHexToBitArray(string hexData)
{
string binary_values = "";
BitArray binary_array;
if (hexData.Length <= "FFFFFFFFFFFFFFFF".Length) // Max Int64
{
binary_values = Convert.ToString(Convert.ToInt64(hexData, 16), 2);
binary_array = new BitArray(binary_values.Length);
for (int i = 0; i < binary_array.Length; i++)
{
if (binary_values[i] == '0')
{
binary_array[i] = false;
}
else
{
binary_array[i] = true;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我删除了大部分错误/异常处理,以保持这个大小,所以请原谅.