2010-01-05 122 views

回答

20

最流行的方式做到这一点。有关如何使用MD5算法对字符串进行散列的优秀blog post here,但System.Cryptography名称空间中还有许多其他示例。使用指定的算法

  1. 哈希用户的口令:

    至于#2,一般的一步一步的指导,如何做到这一点的工作将是以下几点:

    在登记并将其存储在数据库中

  2. Salt该散列(可选的,但优选的)

在登录/用户&口令检查:

  1. 查找在数据库中的用户名
  2. 如果它存在,检索哈希密码
  3. 哈希和盐的输入的密码,并将其与检索密码

这一切都比较啰嗦,但它是非常安全的。

还有另一个非常深入的哈希指南腌制here

+0

附加信息:有几个版本的登录和注册过程http://stackoverflow.com/questions/1471654/reversing-an-md5-hash/1471668#1471668 – 2010-01-05 09:36:59

+0

盐是一个额外的输入到散列过程正常,但在其他方面良好的,明确的解释:在以下SO问题概述。 +1 – 2010-01-05 10:00:48

+0

请帮我在这个问题http://stackoverflow.com/questions/2863034/sql-serverwhat-data-type-to-use-for-password-salt-and-hash-values-and-what-楞 – 2010-05-19 06:16:06

0

的哈希,你有几个System.Security.Cryptography支持的算法,为你的用例,你可能想选择一个SHA基于散列或类似的东西。

关于比较:您不会比较DB值和用户给您的值。您首先使用用于将密码存储在数据库中的相同加密/散列函数,这次是用户输入。如果结果等于数据库中的散列,则密码(可能)是正确的。

其意图是没有人可以访问数据库可以以明文形式检索密码,甚至连程序都不需要知道它(只有接受用户输入的部分才会有短时间) 。

链接(甚至重复):

0

严格地说,你应该salt the password再散列它,以避免字典攻击。您可以使用System.Cryptography名称空间中的HashAlgorithm抽象类的任何实现来计算散列 - 当前最佳选择可能是SHA-2 algorithms之一。

您存储散列而不是密码,并比较散列值以验证用户。

+0

@大卫任何例子 – 2010-01-05 09:32:05

0

像其他人所说的,有很多选择。

下面是一些示例代码Microsoft(使用而不是SHA MD5),这可能有助于让你得到的是使用散列算法开始

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

    string sSourceData; 
    byte[] tmpSource; 
    byte[] tmpHash; 

    sSourceData = "MySourceData"; 
    //Create a byte array from source data. 
    tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData); 

    //Compute hash based on source data. 
    tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource); 
5

简单的哈希:

public string GetSHA256Hash(string s) 
     { 
      if (string.IsNullOrEmpty(s)) 
      { 
       throw new ArgumentException("An empty string value cannot be hashed."); 
      } 

      Byte[] data = System.Text.Encoding.UTF8.GetBytes(s); 
      Byte[] hash = new SHA256CryptoServiceProvider().ComputeHash(data); 
      return Convert.ToBase64String(hash); 
     }