【问题标题】:laravel auth apply bcrypt to username/emaillaravel auth 将 bcrypt 应用于用户名/电子邮件
【发布时间】:2018-02-14 01:05:11
【问题描述】:

laravel auth 系统使用 bcrypt 来保存密码。是否可以对用户名(即电子邮件)做同样的事情?我想避免任何客户电子邮件地址在数据库中保存纯文本。

编辑:

我不需要知道任何其他功能的用户电子邮件。我只希望用户能够使用他们的电子邮件地址登录。我只是想知道是否有一种简单的方法可以使用集成的 laravel 身份验证系统来做到这一点,或者我是否需要自己编写整个身份验证逻辑

【问题讨论】:

  • 在email上应用bcrypt后,无法解密。只能将哈希值与另一个哈希值进行比较。
  • 只要你没问题,永远不知道电子邮件是什么,那么当然可以。也无法按用户名搜索,因为您将无法有效地索引该列。好吧,并非不可能,但非常昂贵。
  • 我不需要知道任何其他功能的用户电子邮件。我只希望用户能够使用他们的电子邮件地址登录。我只是想知道是否有一种简单的方法可以使用集成的 laravel 身份验证系统来做到这一点,或者我是否需要自己编写整个身份验证逻辑
  • 您可以使用RSA等算法实现加密,以便您以后可以根据需要解密该值。

标签: php laravel authentication


【解决方案1】:

根据散列密码对用户进行身份验证的一般流程是:

  1. 用户提交用户名和密码
  2. 根据用户名从数据库中获取一个用户实体
  3. 使用password_verify检查密码
  4. 用户已通过身份验证(或未通过身份验证)

这依赖于以纯文本形式存储的用户名,否则无法执行第二步。如果您还要对用户名进行哈希处理,则该过程需要变为:

  1. 用户提交用户名和密码
  2. 每个用户都从数据库中获取
  3. 用户名和密码都使用password_verify检查
  4. 用户已通过身份验证(或未通过身份验证)

这在理论上是一种可行的方法,但它根本不可扩展。第 2 步需要将所有用户提取到内存中,或者对它们进行分页,这两者都会增加大量开销。验证散列数据也是(按设计)一项昂贵的操作,如果您必须为数据库中的每个用户执行两次,那么每次任何人登录时,您很快就会遇到麻烦。

我认为您可能缺少的一件事是password_hash 每次都会生成不同的哈希,即使对于相同的输入字符串也是如此。这就是使第二种方法不可行的原因,因为它会阻止查找单个用户。

此外,正如 cmets 中提到的,任何使用 bcrypt 散列的东西都将保持散列状态。您可能不需要实际向用户发送电子邮件,但您也将无法在网站上显示他们的用户名,无论是在用户个人资料页面中还是在任何内容/等旁边。

【讨论】:

  • 我猜这是由于 brcypt..?使用不是每个用户唯一的盐的方法怎么样。然后我可以在之前对其进行哈希处理,然后查询数据库以找到匹配项
  • 理论上,当然。但是 bcrypt 被接受为行业标准的原因在于它的设计和安全性。从你开始剥离它的那一刻起,对用户名进行散列处理的意义就更小了。如果您不需要其他任何用户名(电子邮件发送/在标题中显示/等),那么它们也可能只是第二个密码 - 在这种情况下,首先需要更长的密码,并且不要麻烦用户名。
  • 好的,还有一个奇怪的想法。如果我在用户名/电子邮件上使用 bcrypt 并将密码存储为纯文本会怎样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-10
  • 2021-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
  • 2018-05-12
相关资源
最近更新 更多