如何在对称算法中管理密钥

时间:2010-11-12 13:28:59

标签: c# .net cryptography

我在C#代码中使用通过传递密码 salt PasswordDerivedKey函数生成的密钥进行AES加密字节。我在我的应用程序代码中实现了逻辑,“password”是登录用户的用户名,salt是静态字节aray。

存储密码和盐的最佳方式是什么,因为有人可以轻松确定盐(通过反映我的代码)和人的用户名。

我可以采用哪些替代方法以安全的方式存储密码和盐。我不认为将它们存储在我的应用程序代码中是最好的方法。

编辑:通过密码,我指的是PBKDF功能中使用的密钥(用于派生加密密钥),而不是用户提供的密码。我正在使用Windows身份验证

4 个答案:

答案 0 :(得分:3)

如果密码只是Windows用户名的加密版本,为什么还需要存储密码?

无论何时您需要加密/解密,您都知道用户的名称,因此可以动态生成密钥。

绝不应将盐视为安全资产。无需隐藏它。你应该总是假设攻击者知道盐。 Salt只是一种打败彩虹表和其他快速查找的机制。

有什么我没看到的吗?

开启编辑 这个问题在这个问题上是错误的。问题不在于应该存储什么/如何存储。答案很简单。切勿存储任何加密数据(盐除外)。

当前实现从登录用户的用户名创建加密密钥。问题是不安全,因为确定用户名相当容易。为了解决这个问题,需要:

a)接受实施对于愿意反编译app的人来说是不安全的。

b)......不是一个好主意......哈希可以根据群组/角色进行更改

c)为每个用户使用唯一的密码。

c是唯一安全的实现,但它需要在加密或解密时提示用户输入密码。

答案 1 :(得分:2)

对谁来说,数据必须是安全的?如果允许当前登录的用户访问数据,但不允许其他Windows身份验证用户访问,那么您真正想要的是为特定登录用户加密数据。如果您具有配置PC的访问权限,则可以创建仅具有所需用户权限的加密文件夹。这不是100%安全的(如果您具有超级用户访问权限,您仍然可以截取各个地方的数据),但您唯一的其他合理选择是添加另一个密码。

或者,您可以简单地接受保护较弱并提供最小的混淆。这取决于数据的价值和可能的攻击者的能力。如果你的攻击者有足够的权限在实际的机器上反射你的程序集,那么他们很可能也是管理员,这意味着无论你做什么,你都会被搞砸。有些工具可以连接到正在运行的进程并监视其内存,这意味着他们可以等到您解密数据并从内存中读取数据。

答案 2 :(得分:1)

保持盐的最佳方法是在运行时生成盐,并将其与每个会话一起保存,以及用户名和密码等其他用户:

  • 使用登录并提供用户名/密码
  • 使用存储的salt进行哈希并检查密码哈希
  • 创建新的盐并将其与哈希
  • 一起存储

密码完全不建议使用对称加密(甚至不对称)。你不要哈希它只是单向的。

答案 3 :(得分:0)

我将此添加为第二个答案,因为它是一个不同的解决方案。我今晚想到了,因为我正在使用这个类(尝试逆向工程加密)。

您可能需要查看受保护的数据类

http://msdn.microsoft.com/en-us/library/2c64xe0y(v=VS.90).aspx

这是一个允许您将数据存储在Windows加密存储中的类。

通过使用Protect和Unprotect功能,您可以将数据传递到加密存储中并从中提取数据。

如果您不想强制用户创建(并记住)加密密钥,您可以。

1)检查当前用户是否在商店中有加密密钥。

1a)如果没有,则创建一个随机加密密钥

2)使用密钥加密文件并存储

3)从商店解密检索密钥。

4)另一个用户可能能够访问该文件,但无法从商店获得该密钥的副本。

一些警告。只有存储密钥的Windows用户才能检索密钥。但是,这可以根据环境进行绕过。如果用户没有Windows密码(或弱Windows密码),任何访问机器的人都可以作为用户运行,而Windows将很乐意交出密钥。在域环境中,可以模拟用户并修改密码的任何人(管理员)都可以访问密钥。如果用户的Windows配置文件被删除,那么这是加密密钥的唯一副本。