我设法使哈希工作,但盐的部分仍然是个问题。.我一直在搜索和测试示例,但未成功。这是我的哈希代码:
[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);
}
到目前为止,哈希工作..但是,如何在这里使盐工作?
我更喜欢在代码上进行演示,因为我很难用文字来理解它。
我先使用数据库。
参考方案
当涉及到安全性时,请勿尝试重新发明轮子。使用基于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攻击的安全性。
ASP.NET MVC 5自定义登录,无需脚手架,数据库优先 - c#我对asp.net和mvc还是很陌生,所以我正在努力学习尽可能多的知识...为此,我从头开始编写博客网站,但是我对身份验证和授权有些困惑。由于我倾向于不真正使用任何脚手架的东西,所以我首先要使用数据库,所以不希望asp.net身份为我创建表。我对散列和加盐密码很酷,并对照数据库检查用户,我遇到的麻烦是将用户设置为登录状态并检查他们应该能够访问什么。我真的很想…
在线测试系统ASP.NET MVC - javascript我能够按ID显示问题,但不知道如何为不同用户随机显示问题,并且每次用户登录新的随机组合时都会显示问题。有人可以指导吗?我的控制器:public ActionResult Index() { var question = Quiz.Instance.LoadQuiz(); return View(question); } [HttpPost] public A…
MVC C#TempData - c#有人可以解释一下MVC中TempData的目的。我了解它的行为类似于ViewBag,但除此之外它还有什么作用。 参考方案 TempData应该是一个短暂的实例,您应该 仅在当前和后续请求中使用它!以来 TempData以这种方式工作,您需要确定下一步 要求,并且重定向到另一个视图是您唯一的时间 可以保证这一点。因此,唯一使用TempData的方案 在重定向时…
VB.NET C#语法的泛型 - c#您能否告诉我此VB.NET代码的C#等效项:Public Partial Class Index Inherits System.Web.Mvc.Viewpage(Of List(Of Task)) End Class 我不确定在哪里/如何在C#中添加它:public partial class DirList : System.Web.Mvc.ViewPa…
从ASP.NET MVC中的AngularJS控制器加载数据而无需加载整个页面 - javascript这是我的动作: [HttpPost, ValidateAntiForgeryToken] public ActionResult GetData() { //get data from DB and populate model with data return View("Data", model); } 该视图是: @model UI…