Nie*_*ter 7 c# sql-server wpf hash securestring
我相信我误解了一个基本部分SecureString.我知道这string是不可变的,并且在堆上找到密码或敏感数据作为明文.
我正在努力理解的是,如何SecureString在需要验证数据库中哈希密码的客户端应用程序中使用?
这是我的背景:
SecureString通过SecurePassword属性将密码存储在a中.怎么办?如何SecureString首先将WITHOUT重新转换为字符串?
到目前为止我收到的所有建议都是编写扩展方法转换SecureString为String,哈希,然后将其发送到db进行验证.但这打败了整个演习!
我必须接受SecureString在我提到的上下文中没用的东西并使用普通的string吗?
SecureString 表示为 byte[],您可以使用位转换器对字节进行编码并保存结果。此外,SecureString 是一种加密而不是哈希,因为它可以解密。(见下文)
SecureString主要用于在内存中存储敏感数据。如果您有服务/网站,这并不像存储在数据库中的值那么重要。这些永远不应该是明文,并且在我看来,您或任何管理员都无法解密此外,我不确定其他服务器是否可以解密字符串,因此当您更改服务器或具有某种集群场景时,您可能会遇到问题。
特别是对于密码会更喜欢使用散列算法(例如SHA256)。这些无法解密(如数字之和)。在登录功能的用例中,您将加密用户输入并比较用户的哈希值和数据库中的哈希值。(详细信息如下)我还建议向 hashinput 添加动态标准,例如 userid,以便具有相同密码的 2 个用户将具有不同的哈希值。
使用这种策略,您就没有带有用户密码的 RISC,因此如果数据泄露,此时不会出现问题。
这是使用哈希算法的简短概述
因此(如果给出了安全字符串)首先解密安全字符串
String SecureStringToString(SecureString value){
IntPtr valuePtr = IntPtr.Zero;
try{
valuePtr = Marshal.SecureStringToGlobalAllocUnicode(value);
return Marshal.PtrToStringUni(valuePtr);
}
finally{
Marshal.ZeroFreeGlobalAllocUnicode(valuePtr);
}
}
Run Code Online (Sandbox Code Playgroud)
例如,使用 SHA256 对其进行哈希处理。从这篇文章
using (SHA256 hash = SHA256Managed.Create()) {
Encoding enc = Encoding.UTF8;
//the user id is the salt.
//So 2 users with same password have different hashes.
//For example if someone knows his own hash he can't see who has same password
string input = userInput+userId;
Byte[] result = hash.ComputeHash(enc.GetBytes(input));
foreach (Byte b in result)
Sb.Append(b.ToString("x2")); //You could also use other encodingslike BASE64
}
Run Code Online (Sandbox Code Playgroud)
存储这个哈希和。根据您的编码,它可能如下所示:
ac5b208b4d35ec79fa7c14b7a31f9c80392cdab2bc58bc5b79bcfe64b044d899
在你的数据库中。如果用户登录,则根据他的输入创建哈希并将其与数据库中的哈希进行比较。如果它们相等,则密码正确。因此,您永远不需要在任何地方存储明文用户密码。
如果客户端进行哈希,那么它应该绝对不应该以明文形式存在(如果不支持安全字符串,则文本框除外)
PS:这只是一种选择。但最重要的是永远不要在任何地方存储明文密码。最好永远不知道它们,也没有任何改变来解密它们。
另一种策略是使用RSA等非对称加密,但这可能会变得更加复杂。如果您需要这方面的帮助,我会推荐一篇专门的帖子。
根据您的要求和环境,大多数情况下哈希和应该是可接受的解决方案。(但这不是法律建议,因为我不是律师)
| 归档时间: |
|
| 查看次数: |
4679 次 |
| 最近记录: |