Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过Hascode验证密码_C#_Database_Winforms_Hash_Passwords - Fatal编程技术网

C# 通过Hascode验证密码

C# 通过Hascode验证密码,c#,database,winforms,hash,passwords,C#,Database,Winforms,Hash,Passwords,经过研究,我发现在登录页面上使用hascode验证密码更安全,但有人能给我一些关于如何实现密码的见解吗?将给定密码转换为其哈希: using System.Security; using System.Security.Cryptography; ... public static String GetHashValue(String password) { // You may find useful to add "salt" here: // Byte[

经过研究,我发现在登录页面上使用hascode验证密码更安全,但有人能给我一些关于如何实现密码的见解吗?

将给定密码转换为其哈希:

  using System.Security;
  using System.Security.Cryptography; 
  ...

  public static String GetHashValue(String password) {
    // You may find useful to add "salt" here:
    // Byte[] buffer = Encoding.ASCII.GetBytes(password + "some const irregular string");
    Byte[] buffer = Encoding.ASCII.GetBytes(password);

    // I've chosen the strongest (but the longest) hash provider
    using (SHA256 provider = SHA256Managed.Create()) {
      return String.Join("", provider.ComputeHash(buffer).Select(x => x.ToString("X2")));
    }
  }
然后尝试通过用户的登录名和密码哈希查找用户:

  select permissions,
         ... 
    from Users
   where login = @prm_login and
         password_hash = @prm_password_hash  

请注意,您不在数据库中存储密码(例如“123”),而是散列(例如“A665A45920422F9D417E4867EFDC4FB8A04A1F3FFF1FA07E998E86F7F7F7F7A27AE3”)

我不会为您编写代码,但我将简要解释它的工作原理

首先,理解散列和加密之间的区别。如果您没有意识到两者之间存在差异,请阅读以下内容:

默认情况下,您的密码为明文,这是错误的。理想情况下,您希望能够以非明文方式存储该密码,以便可以将其与用户发送给您的数据进行比较。为此,您可以存储加密密码或散列密码

如果您选择存储加密密码,这意味着您打算有朝一日检索原始明文密码(实际上,您永远不需要这样做)。此外,您需要将密钥存储在某个地方,而它会变得混乱(因为您也不想存储明文,所以您需要对其进行加密,但随后您需要另一个密钥,等等),所以我们假设您不想这样做

如果选择存储散列密码,则存储的是该密码的固定长度表示形式。人类不能仅仅通过查看散列来确定原始密码(这很好)

在客户端,您仍然拥有需要提交的明文密码。这就是加密的用武之地。您需要加密客户端和服务器之间的连接。用户提交他们的明文密码,它被加密,所以没有人能理解它,你的服务器解密它,然后立即散列它。此时,您可以将该散列与存储在数据库中的散列进行比较


请注意,对密码客户端进行散列并假设不再需要加密是不安全的。

我建议您阅读检查此答案:它给出了如何实现此类散列和检查的解释。SHA*系列的散列不适合散列密码,因为它们的速度太快。您可以使用普通硬件计算每秒哈希数。因此,您应该切换到具有成本因子(如或PBKDF2)的哈希算法。