我有这个班来代表我的用户:
public class User
{
public int ID {get; set;}
public string UserName {get; set;}
[DataType(DataType.Password)]
public string Password {get; set;}
}
我的寄存器方法的简单版本如下所示:
[HttpPost]
Register(User newUser)
{
...
_context.add(newUser);
await _context.SaveChangesAsync();
...
}
所以我的问题是:我应该在存储之前从常规字符串更改密码类型吗?如果是这样,对于什么数据类型?
答案 0 :(得分:5)
是是是
虽然这很大程度上是安全讨论而不是编程安排,但您应该只存储安全散列(PBKDF2,Argon和Bcrypt是当前标准)以及用于该散列的唯一salt。
按照您的要求存储它只是要求某人窃取您的数据库并获取所有用户密码,而不是阅读Password
列(他们可能会重复使用其他一百万个地方)。
但仍然可以将其存储为string
。
DataType.Password
只是您班级消费者阅读的注释。 (按https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.datatype(v=vs.110).aspx)。从存储/数据库的角度来看,不增强了安全性。
答案 1 :(得分:1)
如果可以避免,永远不会在数据库中存储密码。最佳做法是存储密码的盐渍,不可逆转的散列。
通常情况下,这将是一个SHA2或PBKDF2,或任何用不能改变用户信息的密码 - 例如记录的ID。
您可以将has存储为varbinary(32)或散列算法使用的任何长度。
这种方法意味着您无法确定用户的密码,因为它是不可逆转的。要测试某人尝试登录的密码,请使用相同的salt执行相同的哈希,并测试结果是否与数据库中的结果相同。这样,获取数据库的黑客无法弄清楚每个用户的密码是什么,但您仍然可以测试用户是否知道自己的密码。