生成对称密钥以加密消息时,在进程的内存中创建一个字节数组。
接下来,您实例化SymmetricAlgorithm,例如AesCryptoServiceProvider。然后通常将key属性设置为内存中的键。
然后,您可以通过调用ICryptoTransform或SymmetricAlgorithm.CreateEncryptor()来创建CreateDecryptor()。您也可以跳过设置上方的Key属性,并将密钥和IV直接传递给CreateEncryptor(byte[], byte[])或CreateDecryptor(byte[], byte[])。
创建ICryptoTransform以防止流氓软件读取它后,将字节数置零是否更安全?在使用字节数组生成加密随机数据并初始化转换时,固定是否提供任何安全性?
如果设置了SymmetricAlgorithm.Key属性,是否在某处有一个额外的副本,或者只是一个指向你的秘密字节数组的指针?在创建转换后立即处理SymmetricAlgorithm更安全吗?
创建ICryptoTransform时,我假设RAM中现在有一个额外的副本。那么在ICryptoTransform对象的生命周期内,流氓软件是否可以读取密钥?处置后怎么样?
换句话说,如果我有一个我的软件间歇性地写入加密数据的流,是否最好用一个单独的密钥加密每一点,并在两者之间销毁/处置我可以处理的所有内容,以最大限度地减少密钥被盗的时间?
有人可能会说,一旦计算机上出现流氓软件,没有什么是安全的,因此担心它是没用的。我仍然宁愿采取措施,尽量减少攻击者获取个人数据加密密钥所造成的潜在损害。
答案 0 :(得分:2)
不,这不安全。
没关系,不,这不安全。
是的,任何具有此权限的软件都可以读取它。处理后可能无法读取,因为.Net加密中的Dispose()通常会将内存归零。
关于这一点有很多宗教争论,但是我只是从实际意义上尽可能清楚地回答:如果“流氓软件”,即恶意软件,正在运行时具有访问你的内存空间的权限解密程序,它不仅可以读取密钥,还可以读取您解密的数据。当然,这更像是一个问题 - 毕竟,这就是密钥所保护的东西。您不会阻止用户查看自己的数据,不是吗?那么你就不会添加任何安全性。
换句话说,可计算性的趋势是补充而不是取代主机平台上的安全规则。两者加在一起,两者都是安全所必需的。如果解密机没有主机安全性,则无法获得加密安全性。试图添加它只会增加更多的复杂性,并增加你引入真正的错误的可能性(尽管.NET为你做了内存管理,所以这里不是问题)。