繁体   English   中英

当密码未以纯文本形式存储在数据库中时,如何验证用户?

[英]How users are verified when passwords are NOT stored as plain text in the database?

我知道将密码以明文形式存储在数据库中是不好的,因为如果黑客获得对服务器数据库的访问权限,所有用户名和密码都会完全暴露? 因此,原始密码通过hash函数,之后以一串等长的不可理解字符的形式存储在DB中。 这对安全来说是一件好事。

但是......服务器如何验证用户是否输入了正确的密码? 由于用户在其原始 forms(例如:whoami、ilovecomputer...)中输入密码,但服务器将它们存储在“散列”forms(例如:234203409803249580980gfdg41cdvd4、jknegnergiuhiuhdni4584234dfgbn4j...)下。 如何匹配用户输入的密码和服务器存储的密码?

H为密码散列值 function。这些函数的一个简单属性是它们具有确定性,即相同的输入输出相同的值。

第一次:当用户在网站上注册时,他们需要用户的密码,通常是两个字段。 现在密码被散列h = H(passwd)并存储在用户的数据库中。

稍后时间:用户输入用户名和密码,然后服务器使用用户名从数据库中获取h 也散列当前输入的密码pwd 如果H(pwd) = h那么输入的密码是正确的。 您的服务器允许用户继续使用系统。

以上是密码系统的基础知识,但是,这还不够。 密码散列的一些要点;

  1. 对于密码散列,我们至少不直接使用加密散列。 密码散列需要很快,但是,密码散列需要很慢,甚至可以通过可调整的迭代来控制缓慢。 这有助于系统适应所需的安全性。
  2. 我们使用盐来对抗彩虹攻击; 每个用户的随机盐将防止彩虹攻击。 我们还使用胡椒粉作为域分离的服务器盐。
  3. 我们需要内存硬密码散列来防止大量 GPU/ASIC/FPGA 密码搜索。 有关密码散列的一些比较,请参见 hashcat。
  4. 也需要针对并行化的线程。
  5. 我们使用专门设计的密码哈希算法,如 PBKDF2、Scrypt、Argon2。 Argon2 是最新密码哈希竞赛的获胜者。 建议大家在新系统中使用 Argon2id。

最后一点也是最重要的一点是向用户介绍密码。 首先介绍dicewire或类似的密码生成方法,其次介绍给1passwords等密码管理器。

以下是如何在不以明文形式存储密码的情况下对用户进行身份验证。

您将需要两个数据库列来执行此操作。 第 1 列 - 密码 Hash,第 2 列 - 盐

第 2 列 - Salt 是您的代码/系统为每个用户生成的随机生成值,它是随机的,不会暴露给任何 UI 或后端系统。 (我会在下面解释使用)

第 1 列 - 将是用户密码的哈希值 +(连接)盐。

您可以在此处阅读有关哈希的更多信息Common Hashing Algorithms

整个事情是如何运作的:

哈希:哈希是一种基于算法为每个字符串创建唯一值的方法。 唯一性因算法而异,但除非您有大量记录,否则应该没问题。 此外,每个字符串的 HASH 值都是唯一的。 意味着字符串“test”的 Hash 将始终相同,假设为“123”

Salt: Salt 只是添加到每个密码的随机字符串。 这样 HASH 值被计算为用户的密码 + SALT。 这样可以确保即使多个用户使用相同的密码,他们的密码 Hash(HASH(密码+Salt))也是唯一的。

设置密码

  • 当用户设置他们的密码时,他们将提供一个密码。
  • 您的代码将随机生成一个“盐”值。
  • 将创建第三个变量 PasswordAndSalt = password + salt。
  • 然后会生成第四个变量 hashValue = HASH(PasswordAndSalt)。
  • 然后,您可以将 hashValue 保存在密码 Hash(第 1 列)中,将 Salt 保存在 Salt(第 2 列)中。

添加 SALT 是一种反制措施,因此如果两个用户使用相同的密码,HASH 的值仍然会不同。

验证用户当用户输入他们的用户名和密码时,这就是您的代码将如何执行。

检查用户名是否存在。

  • 如果用户名存在,获取其 SALT 值。
  • 获取用户提供的密码并连接您从数据库获得的 SALT 值。
  • 计算密码 + SALT 的 HASH 值
  • 如果计算出的 HASH 值与数据库中的 SALT 值匹配,则对用户进行身份验证。
  • 否则,告诉用户认证失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM