2017-03-06 105 views
1

我有这个类来表示我的用户:存储密码

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(); 
    ... 
} 

所以我问题是:我应该在存储之前从常规字符串中更改密码类型吗?如果是这样,以什么数据类型?

回答

3

YES YES YES

决不密码保存为纯文本

虽然很多,这是一个安全的讨论,而不是编程,你应该只存储一个安全散列(PBKDF2和Bcrypt是目前的标准)以及用于该散列的独特盐。

按照您的要求存储它只是要求某人窃取您的数据库并获取所有用户密码,而不用花费更多的精力读取Password列(他们可能重用了一百万个其他地方)。

虽然它仍然可以将其存储为string

DataType.Password只是您的课堂消费者阅读的注释。 (根据https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.datatype(v=vs.110).aspx)。它确实从不是从存储/数据库角度增强安全性。

+0

因此,类属性的DataType(DataType.Password)注释是否根本不加密或散列密码? – tocoolforscool

+0

@ j3ssi3ftw请参阅我的编辑 – BradleyDotNET

1

你应该从来没有如果你能避免它存储在数据库中的密码。最佳做法是存储密码的腌制,不可逆转的散列。

通常,这将是SHA2或PBKDF2,或任何不能改变关于用户的密码的密码 - 例如,记录的ID。

您将存储通常作为varbinary(32)或您的散列算法使用的任何长度。

此方法意味着您无法确定用户的密码,因为它是不可逆的。要测试尝试登录的人的密码,请使用相同的salt执行相同的哈希,并测试结果与数据库中的结果是否相同。这样,获取数据库的黑客无法确定每个用户的密码是什么,但是您仍然可以测试用户是否知道自己的密码。

+0

DataType.Password DataAnnotation为属性做了什么? – tocoolforscool

+1

MD5/SHA1的问题不一定是冲突(虽然这是* a *问题),它可以很容易地被消费者硬件破解。 PBKDF2,BCrypt,SCrypt等被设计为*速度很慢*所以暴力攻击要困难得多(通常需要专门的FPGA) – BradleyDotNET

+1

请参阅http://security.stackexchange.com/questions/19906/is-md5-considered -insecure更多 – BradleyDotNET