我正在我的 C# 代码中进行 AES 加密,使用的 key 是使用 PasswordDerivedKey
函数通过传递 password 和 salt 生成的> 12 字节。我已经在我的应用程序代码中实现了逻辑,“密码”是登录用户的用户名,salt 是一个静态字节数组。
存储密码和盐值的最佳方式是什么,因为有人可以轻松确定盐值(通过反射(reflect)我的代码)和一个人的用户名。
我可以采用哪些替代方法来以安全的方式存储密码和盐。我不认为将它们存储在我的应用程序代码中是最好的方法。
编辑:对于密码,我指的是 PBKDF 函数中使用的 key (用于派生加密 key ),而不是用户提供的密码。我正在使用 Windows 身份验证
最佳答案
如果密码只是 Windows 用户名的加密版本,为什么还需要存储密码?
任何时候你需要加密/解密你知道用户名因此可以动态生成 key 。
Salt 永远不应被视为安全 Assets 。无需隐藏它。您应该始终假设攻击者知道盐。 Salt 只是一种击败彩虹表和其他快速查找的机制。
有什么我没看到的吗?
编辑时 这个问题在问题中被错误地陈述了。问题不在于应该存储什么/如何存储。这个答案很简单。切勿存储任何加密数据(盐除外)。
当前的实现从登录用户的用户名创建一个加密 key 。问题是不安全,因为确定用户名相当容易。要解决这个问题,需要:
a) 接受实现对于愿意反编译应用的人来说是不安全的。
b) ...不是一个好主意...哈希可以根据组/角色更改
c) 为每个用户使用唯一的 secret 密码。
c 是唯一安全的实现,但它需要在加密或解密时提示用户输入密码。
关于c# - 如何在对称算法中管理 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4165084/