【问题标题】:Generating derived key from a password stored in a SecureString从存储在 SecureString 中的密码生成派生密钥
【发布时间】:2012-04-10 12:10:08
【问题描述】:

Rfc2898DeriveBytes 类从给定的字符串密码派生出新的加密密钥。据我了解,这应该会增加给定密钥的安全性,因为您不必永久存储密钥 - 它始终可以从用户已知的值派生。但是,由于它只需要一个string 值作为输入,因此原始密码会一直保留在内存中,直到它被 GC 处理。在我看来,这是一个潜在的安全问题,与将密钥本身存储在系统上一样危险。 .NET 框架提供了一个SecureString 实现来保护内存中的密码。但 Rfc2898DeriveBytes 不接受安全字符串。

有什么方法可以从 SecureString 生成加密密钥?

【问题讨论】:

  • 或者,回答这个问题:如果没有平台API进行推导,那么创建SecureString实例是没有用的。
  • 是的 - 这完全是一个骗局。想知道为什么当我在 SO 上搜索它时它没有出现。 Rfc2898DeriveBytes 是一个非常罕见的类,我希望它会发现:(

标签: c# .net cryptography


【解决方案1】:

在初始化加密类时只使用SecureString.ToString() 有什么问题?当方法结束时,.ToString() 的返回值将无法访问,对吧?

编辑:换句话说,类似

var crypto = new Rfc...(secureString.ToString());

【讨论】:

  • 一方面,这并不能解决他的问题,因为string 实例在未定义的时间内仍可能不会被 GC。对于两个,毫无疑问他不想每次都使用System.Security.SecureString作为密码(因为SecureString不提供ToString的重载)。
  • System.Security.SecureString.ToString 方法只返回“System.Security.SecureString”,无论其中实际存储的是哪个字符串。因此,ToString 方法不能用于获取 SecureString 实例的实际值。 System.Security.SecureString 类不会覆盖 Object.ToString 方法,因此当您在 System.Security.SecureString 对象上调用 ToString 时,实际上是在调用 Object.ToString ,它只返回调用它的类型的名称( "返回 this.GetType().ToString();").
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-28
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多