【发布时间】:2017-11-24 10:09:01
【问题描述】:
如果我想保留用户的登录信息,以便他们即使在 1 年不活动之后也不必重新登录,那么存储永久访问令牌与直接存储密码(可能是散列)一样好,因为(永久)访问令牌本质上是“替代密码”?
【问题讨论】:
标签: security authentication passwords
如果我想保留用户的登录信息,以便他们即使在 1 年不活动之后也不必重新登录,那么存储永久访问令牌与直接存储密码(可能是散列)一样好,因为(永久)访问令牌本质上是“替代密码”?
【问题讨论】:
标签: security authentication passwords
存储访问令牌肯定比直接存储密码更安全,但让我们看看为什么:
【讨论】:
一般来说,是的。 但是,有很多警告。
一个长的、随机的令牌,由 CSPRNG 生成(这很重要,有不同的方法可以生成“随机”字符串,而且并不是所有的都是真正随机的),比密码 - 是的。但是,您打算使用此令牌的方式意味着它本身实际上是一个密码,这意味着适用相同的标准:
它不可能是永久的。
密码的一个关键属性是它们不是常数,用户可以在被盗时更改密码,或者随着时间的推移更改密码。任何类型的令牌都应该没有什么不同,只是它应该由您的应用程序定期自动更改(轮换)。
必须散列!
(使用强大的算法:bcrypt、scrypt、Argon-2I、PBKDF2;其他任何东西都是完全错误的)
永远不要在任何地方以纯文本格式存储用户密码。即使可以保证用户不会在任何其他网站上使用此密码,纯文本密码也意味着任何接触数据库的人(即使是很短的时间)都可以劫持用户帐户。
您不仅有责任保护您的用户免受“黑客”的侵害,而且还有责任保护您自己。
即使经过哈希处理或加密,也不要将其存储在 cookie 中。
你提出问题的方式暗示你会做这样的事情。 Cookie 不是存储任何类型密码的安全位置。 临时的、短期的令牌 - 当然,但不是密码。
您似乎正在尝试设计自己的身份验证协议,这不是一件容易的事。让它工作可能很容易,但这只是工作的 5%;有太多细节需要考虑。所有这一切,为了节省用户偶尔输入密码的小麻烦——人们已经习惯了这一点;不值得冒安全风险。
如果您一心想要提供长期登录,我建议您使用现有的身份验证协议。每个这样的协议都使用加密签名,完全避免了对用户密码的依赖,从而几乎完全消除了上述所有问题。
就我个人而言,我只允许所谓的“社交登录”——通过 Facebook、Google、Twitter。您根本不需要处理密码,任何人都可以通过单击按钮登录。
【讨论】:
存储访问令牌比存储密码或哈希密码更好(总是可以尝试蛮力找到密码),我认为你应该给一个令牌终身。
【讨论】:
虽然答案是肯定的,但这也取决于你存放令牌的地方。您可能希望使用 XSRF/CSRF 令牌以及令牌对用户进行身份验证。
但是存储令牌比存储密码更好。
【讨论】: