【问题标题】:Is the way .NET encryption handles keys safe?.NET 加密处理密钥的方式是否安全?
【发布时间】:2012-04-23 22:18:07
【问题描述】:

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

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

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

  1. 创建 ICryptoTransform 后立即将字节数组归零以防止恶意软件读取它是否更安全?在使用字节数组生成加密随机数据和初始化转换时,固定是否提供任何安全性?

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

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

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

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

【问题讨论】:

  • 什么可以防止你没有任何权力的电脑上的任何流氓软件停止你的操作并读取内存?即使你创造了它,使用它并摧毁它一个又一个?
  • 大多数 .Net 加密类会为您安全地擦除 Dispose() 中的数据。
  • @gbainchi:现在,一旦您窃取了密钥,您就可以退出并简单地监控网络。一方面,我猜测当密钥仅在短时间内可用(尤其是密钥每隔几分钟更改一次时)时,获取密钥要比稍后读取文件或 TCP 流更难、更复杂。换句话说,这将是一个重大的挫折。但这是我的问题的一部分,我真的不知道这是否值得。

标签: .net security encryption


【解决方案1】:
  1. 不,这并不安全。

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

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

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

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

【讨论】:

  • 我的问题是,将未加密的密钥尽可能短地保存在内存中并经常更改它们是否足以阻止大多数潜在的窃贼?或者对于普通的黑客来说,果实还不够低?
  • 最后一个断言是正确的。如果您的攻击者具有读取和理解进程内存的技能,那么在数据可用时能够做到这一点是非常小的技能。
猜你喜欢
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
  • 2011-11-10
  • 2017-08-11
相关资源
最近更新 更多