4

在生成对称密钥来加密消息时,您会在进程的内存中创建一个字节数组。

接下来,您实例化一个SymmetricAlgorithm,例如AesCryptoServiceProvider。然后通常将 key 属性设置为内存中的密钥。

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

  1. 一旦创建 ICryptoTransform 以防止流氓软件读取字节数组,是否更安全?在使用字节数组生成加密随机数据并初始化转换时,固定是否提供任何安全性?

  2. 如果您设置 SymmetricAlgorithm.Key 属性,是否在某处有额外的副本,或者只是指向您的秘密字节数组的指针?创建转换后立即处理 SymmetricAlgorithm 是否更安全?

  3. 创建 ICryptoTransform 时,我假设现在 RAM 中有一个额外的副本。那么在 ICryptoTransform 对象的生命周期内,流氓软件是否可以读取密钥?处理后如何?

    换句话说,如果我有一个流,我的软件会间歇性地向其中写入加密数据,那么最好用一个单独的密钥加密每一点,并销毁/处置我所能做的一切,以尽量减少密钥被盗的时间?

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

4

1 回答 1

2
  1. 不,这并不安全。

  2. 没关系,不,这并不安全。

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

对此有很多宗教争论,但我只是从实际意义上尽可能清楚地给出答案:如果“流氓软件”(即恶意软件)以访问解密程序内存空间的权限运行,它不仅可以读取密钥,还可以读取您解密的数据。当然,这更像是一个问题——毕竟这是密钥所保护的。你不会阻止用户查看他们自己的数据,是吗?因此,您没有添加任何安全性。

换句话说,可计算性的原则是补充而不是取代主机平台上的安全规则。两者相加,两者都是安全所必需的。如果解密机器上没有主机安全性,就无法获得加密安全性。尝试添加它只会增加更多复杂性并增加您引入真正错误的可能性(尽管 .NET 会为您进行内存管理,所以这不是问题)。

于 2012-04-12T14:26:12.367 回答