Hep*_*ous 7 c# memory security
我正在制作与安全相关的计划,我想确保我以正确的方式这样做.当有人使用密码登录时,密钥会被解密并存储在变量中.当他们注销时,我希望内存中的数据被完全删除,而不仅仅是标记为已删除.我目前正在做以下事情:
public void Logout()
{
RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider();
for (var i = 0; i < 3; i++)
{
byte[] data = new byte[(int) Math.Round((double) (_phraseHash.Count()))];
rngCsp.GetBytes(data);
int randomNum = BitConverter.ToInt32(data, 0);
_phraseHash = randomNum.ToString();
}
LoggedIn = false;
_phraseHash = null;
}
Run Code Online (Sandbox Code Playgroud)
我想知道的是,这是否足以从系统中完全删除密钥(_phraseHash).
这甚至是必要的吗?我实际上并不知道内存中的数据是如何被删除的,我只是假设它有点类似于硬盘驱动器如何工作,其中字节被标记为删除并在其他需要空间时重写.
我想你可能对SecureString感兴趣
System.String类的一个实例都是不可变的,当不再需要时,不能以编程方式安排垃圾收集; 也就是说,实例在创建后是只读的,并且无法预测何时将从计算机内存中删除实例.因为System.String实例是不可变的,所以看起来修改现有实例的操作实际上会创建一个操作的副本.因此,如果String对象包含敏感信息(如密码,信用卡号或个人数据),则使用该信息后可能会显示该信息,因为您的应用程序无法从计算机内存中删除该数据.
SecureString对象类似于String对象,因为它具有文本值.但是,SecureString对象的值固定在内存中,可以使用保护机制,如底层操作系统提供的加密,可以修改,直到您的应用程序将其标记为只读,并可以从计算机内存中删除您的应用程序调用Dispose方法或.NET Framework垃圾收集器.
归档时间: |
|
查看次数: |
2150 次 |
最近记录: |