2016-10-01 4 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

[Слитый пароль Hashing - Doing it Right] (https://crackstation.net/hashing- security.htm) –

+0

Это сообщение уже ответил [здесь.] (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.

Смежные вопросы