2016-10-01 10 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();  
     } 

ログイン:

これはハッシュと私のコードです10
 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

[Salted Password Hashing - それを正しく行う](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攻撃です。

関連する問題