2016-10-01 109 views
1

我设法得到哈希工作,但盐部分仍然是一个问题..我一直在搜索和测试示例没有成功。这是我的代码以哈希:MVC - 如何哈希和盐

 [Required] 
     [StringLength(MAX, MinimumLength = 3, ErrorMessage = "min 3, max 50 letters")] 
     public string Password { get; set; } 
     public string Salt { get; set; } 

哈希密码功能(无盐):

public string HashPass(string password) { 

     byte[] encodedPassword = new UTF8Encoding().GetBytes(password); 
     byte[] hash = ((HashAlgorithm) CryptoConfig.CreateFromName("MD5")).ComputeHash(encodedPassword); 
     string encoded = BitConverter.ToString(hash).Replace("-", string.Empty).ToLower(); 

      return encoded;//returns hashed version of password 
     } 

注册:

 [HttpPost] 
     public ActionResult Register(User user) { 
      if (ModelState.IsValid) { 

         var u = new User { 
          UserName = user.UserName,        
          Password = HashPass(user.Password)//calling hash-method 
         }; 

         db.Users.Add(u); 
         db.SaveChanges(); 

        return RedirectToAction("Login"); 
       } 
      }return View();  
     } 

登录:

 public ActionResult Login() { 
      return View(); 
     } 

     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Login(User u) { 
      if (ModelState.IsValid) 
      { 
       using (UserEntities db = new UserEntities()) { 

        string readHash = HashPass(u.Password); 

        var v = db.Users.Where(a => a.UserName.Equals(u.UserName) && 
               a.Password.Equals(readHash)).FirstOrDefault(); 
        if (v != null) { 

         return RedirectToAction("Index", "Home"); //after login 
        } 
       } 
      }return View(u); 
     } 

到目前为止散列工作..但我如何使盐工作在这里?

我更喜欢在我的代码上进行演示,因为我发现很难用单词理解。

我先使用数据库。

+0

有一个很好的例子[这里](http://www.obviex.com/samples/hash.aspx) – mmushtaq

+0

[咸味密码散列 - 做对](https://crackstation.net/hashing- security.htm) –

+0

此消息已被回答[here。](http://stackoverflow.com/questions/2138429/hash-and-salt-passwords-in-c-sharp) – Farukh

回答

2

说到安全,不要试图重新发明轮子。使用基于Claims的身份验证。

如果您仍然需要管理用户名和密码使用基于散列的消息认证码(HMAC

我也建议投资某个时候和阅读Enterprise Security Best Practices。已经有聪明的人解决了这个问题,为什么要重新发明轮子。 .NET在那里有所有的好东西。下面

例子:

//--------------------MyHmac.cs------------------- 
public static class MyHmac 
{ 
    private const int SaltSize = 32; 

    public static byte[] GenerateSalt() 
    { 
     using (var rng = new RNGCryptoServiceProvider()) 
     { 
      var randomNumber = new byte[SaltSize]; 

      rng.GetBytes(randomNumber); 

      return randomNumber; 

     } 
    } 

    public static byte[] ComputeHMAC_SHA256(byte[] data, byte[] salt) 
    { 
     using (var hmac = new HMACSHA256(salt)) 
     { 
      return hmac.ComputeHash(data); 
     } 
    } 
} 



//-------------------Program.cs--------------------------- 
string orgMsg = "Original Message"; 
     string otherMsg = "Other Message"; 


     Console.WriteLine("HMAC SHA256 Demo in .NET"); 

     Console.WriteLine("----------------------"); 
     Console.WriteLine(); 

     var salt = MyHmac.GenerateSalt(); 

     var hmac1 = MyHmac.ComputeHMAC_SHA256(Encoding.UTF8.GetBytes(orgMsg), salt); 
     var hmac2 = MyHmac.ComputeHMAC_SHA256(Encoding.UTF8.GetBytes(otherMsg), salt); 


     Console.WriteLine("Original Message Hash:{0}", Convert.ToBase64String(hmac1)); 
     Console.WriteLine("Other Message Hash:{0}", Convert.ToBase64String(hmac1)); 

注意:盐不需要保密,而且可以存储旁边的散列本身。这是为了增加来自rainbow table攻击的安全性。