[英]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
那么输入的密码是正确的。 您的服务器允许用户继续使用系统。
以上是密码系统的基础知识,但是,这还不够。 密码散列的一些要点;
最后一点也是最重要的一点是向用户介绍密码。 首先介绍dicewire或类似的密码生成方法,其次介绍给1passwords等密码管理器。
以下是如何在不以明文形式存储密码的情况下对用户进行身份验证。
您将需要两个数据库列来执行此操作。 第 1 列 - 密码 Hash,第 2 列 - 盐
第 2 列 - Salt 是您的代码/系统为每个用户生成的随机生成值,它是随机的,不会暴露给任何 UI 或后端系统。 (我会在下面解释使用)
第 1 列 - 将是用户密码的哈希值 +(连接)盐。
您可以在此处阅读有关哈希的更多信息Common Hashing Algorithms
整个事情是如何运作的:
哈希:哈希是一种基于算法为每个字符串创建唯一值的方法。 唯一性因算法而异,但除非您有大量记录,否则应该没问题。 此外,每个字符串的 HASH 值都是唯一的。 意味着字符串“test”的 Hash 将始终相同,假设为“123”
Salt: Salt 只是添加到每个密码的随机字符串。 这样 HASH 值被计算为用户的密码 + SALT。 这样可以确保即使多个用户使用相同的密码,他们的密码 Hash(HASH(密码+Salt))也是唯一的。
设置密码
添加 SALT 是一种反制措施,因此如果两个用户使用相同的密码,HASH 的值仍然会不同。
验证用户当用户输入他们的用户名和密码时,这就是您的代码将如何执行。
检查用户名是否存在。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.