我在C#代码中使用通过传递密码和 salt 的PasswordDerivedKey
函数生成的密钥进行AES加密字节。我在我的应用程序代码中实现了逻辑,“password”是登录用户的用户名,salt是静态字节aray。
存储密码和盐的最佳方式是什么,因为有人可以轻松确定盐(通过反映我的代码)和人的用户名。
我可以采用哪些替代方法以安全的方式存储密码和盐。我不认为将它们存储在我的应用程序代码中是最好的方法。
编辑:通过密码,我指的是PBKDF功能中使用的密钥(用于派生加密密钥),而不是用户提供的密码。我正在使用Windows身份验证
答案 0 :(得分:3)
如果密码只是Windows用户名的加密版本,为什么还需要存储密码?
无论何时您需要加密/解密,您都知道用户的名称,因此可以动态生成密钥。
绝不应将盐视为安全资产。无需隐藏它。你应该总是假设攻击者知道盐。 Salt只是一种打败彩虹表和其他快速查找的机制。
有什么我没看到的吗?
开启编辑 这个问题在这个问题上是错误的。问题不在于应该存储什么/如何存储。答案很简单。切勿存储任何加密数据(盐除外)。
当前实现从登录用户的用户名创建加密密钥。问题是不安全,因为确定用户名相当容易。为了解决这个问题,需要:
a)接受实施对于愿意反编译app的人来说是不安全的。
b)......不是一个好主意......哈希可以根据群组/角色进行更改
c)为每个用户使用唯一的密码。
c是唯一安全的实现,但它需要在加密或解密时提示用户输入密码。
答案 1 :(得分:2)
对谁来说,数据必须是安全的?如果允许当前登录的用户访问数据,但不允许其他Windows身份验证用户访问,那么您真正想要的是为特定登录用户加密数据。如果您具有配置PC的访问权限,则可以创建仅具有所需用户权限的加密文件夹。这不是100%安全的(如果您具有超级用户访问权限,您仍然可以截取各个地方的数据),但您唯一的其他合理选择是添加另一个密码。
或者,您可以简单地接受保护较弱并提供最小的混淆。这取决于数据的价值和可能的攻击者的能力。如果你的攻击者有足够的权限在实际的机器上反射你的程序集,那么他们很可能也是管理员,这意味着无论你做什么,你都会被搞砸。有些工具可以连接到正在运行的进程并监视其内存,这意味着他们可以等到您解密数据并从内存中读取数据。
答案 2 :(得分:1)
保持盐的最佳方法是在运行时生成盐,并将其与每个会话一起保存,以及用户名和密码等其他用户:
密码完全不建议使用对称加密(甚至不对称)。你不要哈希它只是单向的。
答案 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配置文件被删除,那么这是加密密钥的唯一副本。