【发布时间】:2012-04-23 22:18:07
【问题描述】:
在生成对称密钥来加密消息时,您会在进程的内存中创建一个字节数组。
接下来实例化一个SymmetricAlgorithm,例如AesCryptoServiceProvider。然后通常将 key 属性设置为内存中的键。
然后您创建一个ICryptoTransform,通常通过调用SymmetricAlgorithm.CreateEncryptor() 或CreateDecryptor()。您也可以跳过上面的 Key 属性设置,直接将密钥和 IV 传递给 CreateEncryptor(byte[], byte[]) 或 CreateDecryptor(byte[], byte[])。
创建 ICryptoTransform 后立即将字节数组归零以防止恶意软件读取它是否更安全?在使用字节数组生成加密随机数据和初始化转换时,固定是否提供任何安全性?
如果您设置 SymmetricAlgorithm.Key 属性,是否在某处有额外的副本,或者只是指向您的秘密字节数组的指针?在创建转换后立即处理 SymmetricAlgorithm 是否更安全?
当创建 ICryptoTransform 时,我假设现在 RAM 中有一个额外的副本。那么在 ICryptoTransform 对象的生命周期内,流氓软件是否可以读取密钥?处理后怎么样?
换句话说,如果我有一个流,我的软件会间歇性地向其中写入加密数据,那么最好用一个单独的密钥加密每一点,并销毁/处置我能做的所有事情,以尽量减少密钥可能被盗的时间?
有人可能会说,一旦计算机上有流氓软件,就没有什么是安全的,因此担心它是没有用的。我仍然宁愿采取措施,尽量减少攻击者获得个人数据加密密钥的访问权限所造成的潜在损害。
【问题讨论】:
-
什么可以防止你没有任何权力的电脑上的任何流氓软件停止你的操作并读取内存?即使你创造了它,使用它并摧毁它一个又一个?
-
大多数 .Net 加密类会为您安全地擦除
Dispose()中的数据。 -
@gbainchi:现在,一旦您窃取了密钥,您就可以退出并简单地监控网络。一方面,我猜测当密钥仅在短时间内可用(尤其是密钥每隔几分钟更改一次时)时,获取密钥要比稍后读取文件或 TCP 流更难、更复杂。换句话说,这将是一个重大的挫折。但这是我的问题的一部分,我真的不知道这是否值得。
标签: .net security encryption