【问题标题】:storing passwords in sql server database using ef core code first首先使用 ef 核心代码将密码存储在 sql server 数据库中
【发布时间】:2017-07-26 20:18:22
【问题描述】:

我有这个类来代表我的用户:

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

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

【问题讨论】:

    标签: c# authentication passwords asp.net-core-mvc


    【解决方案1】:

    是是是

    永远不要将密码存储为纯文本

    虽然其中大部分是安全讨论而不是编程讨论,但您应该只存储安全哈希(PBKDF2、Argon 和 Bcrypt 是当前标准)以及用于该哈希的唯一盐。

    按原样存储它只是要求某人窃取您的数据库并获取所有用户的密码,而不是阅读Password 列(他们可能在其他一百万个地方重复使用)。

    不过,将其存储为 string 仍然可以。

    DataType.Password 只是一个注释,供你的类的消费者阅读。 (根据https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.datatype(v=vs.110).aspx)。从存储/数据库的角度来看,它不会增强安全性。

    【讨论】:

    • 那么类属性的 DataType(DataType.Password) 注释根本不加密或散列密码吗?
    【解决方案2】:

    如果可以避免,您应该永远在数据库中存储密码。最佳做法是存储加密的、不可逆的密码哈希。

    通常这将是 SHA2 或 PBKDF2,或任何密码,其中包含无法更改用户的内容——例如记录的 ID。

    您通常会将 has 存储为 varbinary(32) 或您的哈希算法使用的任何长度。

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

    【讨论】:

    • 那么DataType.Password DataAnnotation 对属性有什么作用?
    • MD5/SHA1 的问题不一定是冲突(尽管这是一个 问题),而是它们很容易被消费类硬件破解。 PBKDF2、BCrypt、SCrypt 等被设计为 缓慢,因此蛮力攻击更加困难(通常需要专门的 FPGA)
    • 我拼命地在帖子中添加了一堆标签,只是为了达到 50 个代表,所以我可以在这篇帖子上发表评论,说使用 MD5 等作为密码是多么糟糕的想法,但 BradleyDotNET 击败了我对它。我仍然想重申,这是一个糟糕的主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 2018-09-18
    • 1970-01-01
    相关资源
    最近更新 更多