我一直在寻找一个关于如何在典型的网站环境中实现密码登录系统的很好的解释。我已经阅读了一些很棒的维基百科文章和 SO Q&A 和博客等,但他们似乎总是专注于纯粹生成哈希,而不是创建哈希发送它的哪些部分、存储它的哪些部分、服务器端代码做什么的整个过程与它等等。如果已经有一个很好的答案,我很抱歉重新发布,请链接。
我目前的理解是:
1) 新用户在您的网站上创建一个新帐户。他们输入一个“密码”,然后客户端代码生成一个长随机字符串“salt”并将其附加到末尾,并生成一个哈希 -> BCrypt(password+salt) 例如。然后,客户端代码将完整的哈希加上未哈希的盐发送到服务器。
2)服务器将完整的哈希和未哈希的盐存储在数据库中的用户条目中。
3)在用户登录期间,他们输入密码,然后再次用盐进行哈希处理,
问题 1) 客户端代码如何为每个用户生成相同的“随机”盐值?
问题2)此时客户端代码是否只发送没有盐的完整哈希?
问题3)服务器端收到完整哈希后会做什么?(只需将发送的完整哈希与存储的完整哈希进行比较?如果是这种情况,那么攻击者不能在闯入数据库并获取存储的完整哈希值时直接使用它们发送到服务器进行登录吗?这是基于我的假设,即登录过程本质上涉及服务器将客户端发送的完整哈希与存储在数据库中的完整哈希进行比较。
问题 4) 是否应始终通过安全连接发送密码?还是对它们进行加盐和散列处理可以让任何人看到?