.NET加密处理密钥安全的方式是什么?

生成对称密钥以加密消息时,可以在进程的内存中创建一个字节数组.

接下来,您将实例化SymmetricAlgorithm,例如AesCryptoServiceProvider.然后,通常将key属性设置为内存中的键.

然后创建一个ICryptoTransform,通常通过调用SymmetricAlgorithm.CreateEncryptor()CreateDecryptor().您还可以跳过设置上面的Key属性并将密钥和IV直接传递给CreateEncryptor(byte[], byte[])CreateDecryptor(byte[], byte[]).

>一旦创建ICryptoTransform以防止流氓软件读取它,将字节数组归零是否更安全?在使用字节数组生成加密随机数据并初始化转换时,固定是否提供任何安全性?
>如果设置了SymmetricAlgorithm.Key属性,是否在某处有一个额外的副本,或者只是一个指向你的秘密字节数组的指针?在创建转换后立即配置SymmetricAlgorithm更安全吗?
>创建ICryptoTransform时,我假设RAM中现在有一个额外的副本.那么在ICryptoTransform对象的生命周期内,流氓软件是否可以读取密钥?处置后怎么样?
换句话说,如果我有一个我的软件间歇性地写入加密数据的流,是否最好用一个单独的密钥加密每一点,并在两者之间销毁/处置我可以处理的所有内容,以最大限度地减少密钥被盗的时间?

有人可能会说,一旦计算机上出现流氓软件,没有什么是安全的,因此担心它是没用的.我仍然宁愿采取措施尽量减少攻击者获取个人数据加密密钥所造成的潜在损害.

最佳答案 >不,这不安全.

>没关系,不,不是更安全.

>是的,任何具有此权限的软件都可以读取它.处理后它可能无法读取,因为.Net加密中的Dispose()通常会将内存归零.

关于这一点有很多宗教争论,但是我只是从实际意义上尽可能清楚地回答:如果“流氓软件”,即恶意软件,正在以访问解密程序的内存空间的权限运行,它不仅可以读取密钥,还可以读取您解密的数据.当然,这更像是一个问题 – 毕竟,这就是密钥所保护的东西.您不会阻止用户查看自己的数据,不是吗?那么你就不会添加任何安全性.

换句话说,可计算性的趋势是补充而不是取代主机平台上的安全规则.两者加在一起,两者都是安全所必需的.如果解密机没有主机安全性,则无法获得加密安全性.试图添加它只会增加更多的复杂性并增加你引入真正错误的可能性(尽管.NET为你做了你的内存管理,所以这不是一个问题).

点赞