如何使用C#对密码值进行盐和哈希处理?

17

大家好,

我得知从数据库中存储密码的首选方法来看,将密码的哈希值进行存储是安全的...

  • 如何使用C#对密码进行加盐和哈希处理?

  • 如何比较数据库中存储的值和用户输入的值?


1
这里有一个相关的库:http://encrypto.codeplex.com/ - Omu
6个回答

21
最流行的方法是使用散列算法。有一篇关于如何使用MD5算法散列字符串的博客文章在这里,但是在System.Cryptography命名空间中有许多其他示例。
至于第二点,通常的步骤将如下: 注册时:
  1. 使用指定的算法哈希用户密码并将其存储在数据库中
  2. Salt此哈希(可选,但最好)
登录/用户和密码检查时:
  1. 在数据库中查找用户名
  2. 如果存在,则检索哈希密码
  3. 对输入的密码进行哈希和加盐,并将其与检索到的密码进行比较
这都相对冗长,但非常安全。
有另一篇极其详尽的关于哈希和加盐的指南在这里

附加信息:以下SO问题中概述了登录和注册过程的几个版本:http://stackoverflow.com/questions/1471654/reversing-an-md5-hash/1471668#1471668 - Daniel May
盐通常是哈希过程的附加输入,但除此之外,这是一个很好、清晰的解释。 +1 - David M
请帮我回答这个问题:https://dev59.com/j3E85IYBdhLWcg3wQxPG - ACP
当用户登录时,您如何知道要使用哪个盐?因为对于每个用户来说,它们都是不同的,不是吗? - Omu

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);
        }

0

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

这里是一些示例代码(使用 MD5 而不是 SHA)来自 Microsoft,可能会帮助您入门。

   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);

0

在哈希方面,System.Security.Cryptography中有几种支持的算法,对于您的用例,您可能想选择基于SHA的哈希或类似的东西。

关于比较:您不会比较DB值和用户提供给您的值。您使用与首次将密码存储在DB中时使用的相同的加密/哈希函数,这次使用用户输入。如果结果等于DB中的哈希,则密码(可能)正确。

意图是没有任何可以访问DB的人可以以明文检索密码,甚至您的程序也不需要知道它(只有接受用户输入的部分会短暂拥有它)。

链接(甚至可能重复):


0

严格来说,您应该加盐密码然后进行哈希处理,以避免字典攻击。您可以使用System.Cryptography命名空间中HashAlgorithm抽象类的任何实现来计算哈希值 - 目前最好的选择可能是SHA-2算法之一。

您存储哈希值而不是密码,并比较哈希值以验证用户身份。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接