[英]MVC - How to hash and salt
我設法使哈希工作,但鹽的部分仍然是一個問題。.我一直在搜索和測試示例,但未成功。 這是我的哈希代碼:
[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);
}
到目前為止,哈希工作..但是我如何使鹽在這里工作?
我希望在我的代碼上進行演示,因為我很難用文字來理解。
我先使用數據庫。
當涉及到安全性時,請勿嘗試重新發明輪子。 使用基於聲明的身份驗證。
如果仍然必須管理用戶名和密碼,請使用基於哈希的消息身份驗證代碼( HMAC )
我還建議您花一些時間閱讀《 企業安全最佳實踐》 。 已經有更聰明的人解決了這個問題,為什么需要重新發明輪子。 .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));
注意:鹽不必保密,可以與哈希值本身一起存儲。 這是為了提高彩虹表攻擊的安全性。
使用Microsoft的System.Web.Helpers.Crypto
NuGet程序包。 它為您照顧鹽。
您可以像這樣對密碼進行哈希處理: var hash = Crypto.HashPassword("foo");
您可以像這樣驗證密碼: var verified = Crypto.VerifyHashedPassword(hash, "foo");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.