【问题标题】:Is storing a permanent access token as good as storing password?存储永久访问令牌是否与存储密码一样好?
【发布时间】:2017-11-24 10:09:01
【问题描述】:

如果我想保留用户的登录信息,以便他们即使在 1 年不活动之后也不必重新登录,那么存储永久访问令牌与直接存储密码(可能是散列)一样好,因为(永久)访问令牌本质上是“替代密码”?

【问题讨论】:

    标签: security authentication passwords


    【解决方案1】:

    存储访问令牌肯定比直接存储密码更安全,但让我们看看为什么:

    1. 攻击者只能获取此令牌,而不能获取原始密码。这更好,因为密码经常在其他网站上重复使用,和/或可能会泄露密码方案。 ➽ 确保令牌是随机的,而不是来自密码。
    2. 令牌不仅仅是另一个密码。虽然用户选择的密码通常很弱,但令牌却非常强大。它们是如此强大,以至于暴力破解是不切实际的。 ➽ 生成随机的、足够长的标记,它们至少应为 20 个字符 a-z、A-Z、0-9。

    【讨论】:

    • 我个人不会将访问令牌存储在数据库中。只需将它们存储在内存中,并在用户注销或服务器重新启动时使它们失效。
    【解决方案2】:

    一般来说,是的。 但是,有很多警告。

    一个长的、随机的令牌,由 CSPRNG 生成(这很重要,有不同的方法可以生成“随机”字符串,而且并不是所有的都是真正随机的),比密码 - 是的。但是,您打算使用此令牌的方式意味着它本身实际上是一个密码,这意味着适用相同的标准:

    • 它不可能是永久的。

      密码的一个关键属性是它们不是常数,用户可以在被盗时更改密码,或者随着时间的推移更改密码。任何类型的令牌都应该没有什么不同,只是它应该由您的应用程序定期自动更改(轮换)。

    • 必须散列!

      (使用强大的算法:bcrypt、scrypt、Argon-2I、PBKDF2;其他任何东西都是完全错误的)

      永远不要在任何地方以纯文本格式存储用户密码。即使可以保证用户不会在任何其他网站上使用此密码,纯文本密码也意味着任何接触数据库的人(即使是很短的时间)都可以劫持用户帐户。
      您不仅有责任保护您的用户免受“黑客”的侵害,而且还有责任保护您自己。

    • 即使经过哈希处理或加密,也不要将其存储在 cookie 中。

      你提出问题的方式暗示你会做这样的事情。 Cookie 不是存储任何类型密码的安全位置。 临时的、短期的令牌 - 当然,但不是密码。

    您似乎正在尝试设计自己的身份验证协议,这不是一件容易的事。让它工作可能很容易,但这只是工作的 5%;有太多细节需要考虑。所有这一切,为了节省用户偶尔输入密码的小麻烦——人们已经习惯了这一点;不值得冒安全风险。

    如果您一心想要提供长期登录,我建议您使用现有的身份验证协议。每个这样的协议都使用加密签名,完全避免了对用户密码的依赖,从而几乎完全消除了上述所有问题。

    就我个人而言,我只允许所谓的“社交登录”——通过 Facebook、Google、Twitter。您根本不需要处理密码,任何人都可以通过单击按钮登录。

    【讨论】:

    • “所有这一切,只是为了省去用户偶尔输入密码的小麻烦——人们已经习惯了这一点;不值得冒安全风险。”我认为这与 A) 有更多的关系,要求他们记住另一个密码,他们只会重复使用不好的密码。 B)将另一个密码存储在数据库中。在我看来,访问令牌根本不应该存储在数据库中。它们应该只在内存中,当用户离开应用程序时,它会被删除。
    【解决方案3】:

    存储访问令牌比存储密码或哈希密码更好(总是可以尝试蛮力找到密码),我认为你应该给一个令牌终身。

    【讨论】:

      【解决方案4】:

      虽然答案是肯定的,但这也取决于你存放令牌的地方。您可能希望使用 XSRF/CSRF 令牌以及令牌对用户进行身份验证。

      但是存储令牌比存储密码更好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-26
        • 1970-01-01
        • 1970-01-01
        • 2011-03-18
        • 2019-11-16
        • 2012-07-18
        • 2018-02-08
        • 2019-03-24
        相关资源
        最近更新 更多