Security 在web应用程序中实现密码加密和哈希的基本过程

Security 在web应用程序中实现密码加密和哈希的基本过程,security,hash,Security,Hash,我一直在寻找一个关于如何在典型的网站环境中实现密码登录系统的好解释。我读过一些很棒的维基百科文章,问答和博客等,但他们似乎总是专注于纯粹生成散列,而不是创建散列的整个过程——发送散列的哪些部分、存储散列的哪些部分、服务器端代码对散列做了什么等等。如果已经有一个很好的答案,那么我为重新发布道歉,请链接 我目前的理解是: 1) 新用户在您的网站上创建新帐户。他们输入一个“密码”,然后客户端代码生成并在末尾附加一个长随机字符串“salt”,并生成一个hash->BCrypt(password+salt

我一直在寻找一个关于如何在典型的网站环境中实现密码登录系统的好解释。我读过一些很棒的维基百科文章,问答和博客等,但他们似乎总是专注于纯粹生成散列,而不是创建散列的整个过程——发送散列的哪些部分、存储散列的哪些部分、服务器端代码对散列做了什么等等。如果已经有一个很好的答案,那么我为重新发布道歉,请链接

我目前的理解是:

1) 新用户在您的网站上创建新帐户。他们输入一个“密码”,然后客户端代码生成并在末尾附加一个长随机字符串“salt”,并生成一个hash->BCrypt(password+salt),例如。然后,客户机代码将完整的散列加上未清除的盐发送到服务器

2) 服务器将完整的散列和未清除的salt存储在数据库中的users条目中

3) 在用户登录期间,他们键入密码,然后再次用盐散列

问题1)客户端代码如何为每个用户生成相同的“随机”盐值

问题2)在这一点上,客户端代码是否只发送不带salt的完整哈希

问题3)服务器端在收到完整散列后如何处理它?(只需将发送的完整哈希值与存储的完整哈希值进行比较?如果是这样的话,攻击者在侵入数据库并获取存储的完整哈希值时不能直接使用它们发送到服务器进行登录?这是基于我的假设,即登录过程基本上涉及服务器比较从数据库发送的完整哈希值。)将完整哈希存储在数据库中的e客户端


问题4)是否应始终通过安全连接发送密码?或者盐析和散列可以让任何人看到吗?

你混淆了散列的目的。它不是为了保护有线传输的密码。客户端不生成哈希。散列的目的是防止危及数据库安全的攻击者能够快速使用预先生成的散列查找表来确定用户的密码

下面是一个简单的例子——正如@jhoyla在下面的评论中指出的,工业级生产计划甚至更为复杂

要创建帐户,请执行以下操作:

  • 客户端与服务器建立安全的(加密的,例如SSL)连接,并发送用户名和密码,通常是明文(这是可以的,因为它是加密的)

  • 服务器生成一个随机salt,将其附加到密码中,对结果进行散列,并存储散列和未散列的salt值

  • 要登录:

  • 客户端与服务器建立安全的(加密的,例如SSL)连接,并发送用户名和密码,通常是明文(这是可以的,因为它是加密的)

  • 服务器从存储器中检索salt,将其附加到密码中,对其进行散列,并将结果与存储器中的散列密码进行比较。如果匹配,则用户已登录

  • 为了确定我们为什么这样做,假设我成功地攻击了一个网站的数据库服务器并下载了数据库。我现在有一个用户名列表,可能是电子邮件地址和密码哈希。如果密码没有加盐,那么很有可能许多散列是相同的(因为许多人使用相同的弱密码)。我知道,其中一个用户(例如)在其电子邮件帐户上拥有相同弱密码的可能性相当高。所以我开始工作,将整个字典和许多其他可能的密码进行散列,寻找与这些流行密码之一匹配的散列。如果我被击中了,我只是打破了一堆密码。如果我聪明的话,我会提前生成这个列表,这样我就可以快速完成


    现在想象一下,密码是咸的。现在,即使两个人使用相同的密码,也会为他们每个人生成不同的salt,产生的哈希值也会不同。我无法知道哪些密码是弱密码,哪些是普通密码,哪些是强密码。我可以通过向每个可能的密码添加salt来尝试字典攻击,但是破解密码的难度(就时间而言)现在呈指数级增加。

    您混淆了哈希的目的。它不是为了保护有线传输的密码。客户端不生成哈希。散列的目的是防止危及数据库安全的攻击者能够快速使用预先生成的散列查找表来确定用户的密码

    下面是一个简单的例子——正如@jhoyla在下面的评论中指出的,工业级生产计划甚至更为复杂

    要创建帐户,请执行以下操作:

  • 客户端与服务器建立安全的(加密的,例如SSL)连接,并发送用户名和密码,通常是明文(这是可以的,因为它是加密的)

  • 服务器生成一个随机salt,将其附加到密码中,对结果进行散列,并存储散列和未散列的salt值

  • 要登录:

  • 客户端与服务器建立安全的(加密的,例如SSL)连接,并发送用户名和密码,通常是明文(这是可以的,因为它是加密的)

  • 服务器从存储器中检索salt,将其附加到密码中,对其进行散列,并将结果与存储器中的散列密码进行比较。如果匹配,则用户已登录

  • 为了确定我们为什么这样做,假设我成功地攻击了一个网站的数据库服务器并下载了数据库。我现在有一个用户名列表,可能是电子邮件地址和密码哈希。如果密码没有加盐,那么就有一个