通过哈希码验证密码

时间:2014-06-05 12:56:16

标签: c# database winforms hash passwords

经过研究,我发现使用hascode来验证登录页面上的密码是否更安全,但任何人都可以通过代码明智地告诉我如何实现它?

2 个答案:

答案 0 :(得分:1)

我不会为你编写代码,但我会简要解释它是如何工作的。

首先,了解散列和加密之间的区别。如果您没有意识到存在差异,请阅读:Fundamental difference between Hashing and Encryption algorithms

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

如果您选择存储加密密码,这意味着您打算有一天检索原始明文密码(实际上,您绝不应该这样做)。此外,你需要将密钥存储在某个地方,并且它变得混乱(因为你不是真的想要存储那个明文,所以你加密它,但是你需要另一个密钥等),所以让#39我只是假设你不想这样做。

如果您选择存储HASHED密码,那么您存储的是该密码的固定长度表示。仅仅通过查看哈希就可以确定原始密码(这很好)。

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

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

答案 1 :(得分:0)

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

  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  

请注意,您不会在数据库中存储密码(例如&#34; 123&#34; ),但哈希< / em>(例如"A665A45920422F9D417E4867EFDC4FB8A04A1F3FFF1FA07E998E86F7F7A27AE3"