Security 在内部保持密码长度一致,并保持salt机密?

Security 在内部保持密码长度一致,并保持salt机密?,security,cryptography,passwords,salt,sha,Security,Cryptography,Passwords,Salt,Sha,当存储密码时,有人说Salt不需要保密,它的唯一目的是保持所有散列的唯一性。也有人说,限制密码长度不是一个好的做法,但请考虑这个例子: 在散列之前,我们确保纯文本版本在内部始终为128个字符,方法是将用户输入的大小调整到最大值100,然后添加额外的字符作为salt 所以,若用户输入20个字符,我们将附加108个随机字符作为salt。如果用户输入100,我们附加28,依此类推。关键是,纯文本版本的长度应该是128个字符。在代码中,它可能如下所示: $salt = generate_salt($

当存储密码时,有人说Salt不需要保密,它的唯一目的是保持所有散列的唯一性。也有人说,限制密码长度不是一个好的做法,但请考虑这个例子:

在散列之前,我们确保纯文本版本在内部始终为128个字符,方法是将用户输入的大小调整到最大值100,然后添加额外的字符作为salt

所以,若用户输入20个字符,我们将附加108个随机字符作为salt。如果用户输入100,我们附加28,依此类推。关键是,纯文本版本的长度应该是128个字符。在代码中,它可能如下所示:

$salt   = generate_salt($pass); // length varies as explained above
$hash   = hash('sha512', $pass.$salt);
这样,哈希之前的纯文本将始终为128个字符

我们在服务器A上存储$hash,在服务器B上存储$salt

现在让我们假设攻击者获得了对散列数据库服务器A的访问权,并成功地反转了散列。看起来对他很好,但他看到的纯文本版本或反向哈希仍然看起来像哈希,因为它是128个字符。因为他不知道盐,所以他永远也不会知道原来的密码

作为一个额外的挑战,由于SHA512产生128个字符,他也永远无法确定是否已经达到纯文本版本,因为like已经提到纯文本版本看起来像散列。显而易见,他可能会认为这是一个迭代版本,如果是的话,他可能会继续迭代,可能是无限期的

这种方法有什么问题吗?因为在散列反转的情况下,保留salt机密可以提供额外的安全性,并且,保持纯文本长度一致可以说增加了一层混淆

注意:这当然假设您的应用程序有多个失败的登录检测/预防。

Salt不需要保密,它的唯一目的是保持所有哈希唯一

它还使强制执行哈希表变得“更慢”,因为您需要对每个哈希+盐组合每行进行一次尝试,而不是仅对整个表“select*from passwords”(其中hash='xxx')尝试一次哈希

保留salt机密可以提供额外的安全性,并且,保持纯文本长度的一致性可以说增加了一层混淆

事实上,您的“反向散列”看起来像散列,并没有增加真正的额外安全性,它实际上只是模糊性带来的安全性。您的Web服务器将需要连接到服务器A和服务器B以验证用户/密码组合,因此当该服务器受到威胁时,所有希望都将破灭

你可能感兴趣的一篇文章是。编辑:发布了错误的编码或链接

Salt不需要保密,它的唯一目的是保持所有哈希唯一

它还使强制执行哈希表变得“更慢”,因为您需要对每个哈希+盐组合每行进行一次尝试,而不是仅对整个表“select*from passwords”(其中hash='xxx')尝试一次哈希

保留salt机密可以提供额外的安全性,并且,保持纯文本长度的一致性可以说增加了一层混淆

事实上,您的“反向散列”看起来像散列,并没有增加真正的额外安全性,它实际上只是模糊性带来的安全性。您的Web服务器将需要连接到服务器A和服务器B以验证用户/密码组合,因此当该服务器受到威胁时,所有希望都将破灭

你可能感兴趣的一篇文章是。编辑:发布错误的密码或链接首先,除非你真的知道自己在做什么,否则不要发明自己的密码系统

使用一个现有的方法,比如scrypt,它比简单的salt散列法有优势,因为这三种方法都使用了更多的CPU时间和/或内存,这使得并行化成本更高

散列中的盐只保护彩虹表,不保护暴力攻击

如果攻击者成功反转哈希值,他将获得$pass.$salt的信息,从而获得密码

salt的目的是避免廉价创建rainbow表,也就是说,攻击者不只是计算每个可能密码的哈希值并将其与数据库进行比较,而是针对每个不同的salt执行此操作

保守salt秘密的理论优势是使攻击更加昂贵,因为攻击者还必须为每个可能的密码尝试所有可能的salt

然而,实际上,一旦他能够访问服务器A,他就可能能够访问服务器B

如果某个东西看起来像散列,可能并不重要。一旦服务器遭到破坏,攻击者可能会发现使用了哪些混淆技术

另一方面:SHA-512产生512位输出,即64个ASCII字符。

首先,除非你真的知道自己在做什么,否则不要发明自己的密码系统

使用一个现有的函数,比如scrypt,它比简单的salt散列有优势,因为它们使用的函数更多 这三种方法都需要CPU时间和/或内存,这使得并行化成本很高

散列中的盐只保护彩虹表,不保护暴力攻击

如果攻击者成功反转哈希值,他将获得$pass.$salt的信息,从而获得密码

salt的目的是避免廉价创建rainbow表,也就是说,攻击者不只是计算每个可能密码的哈希值并将其与数据库进行比较,而是针对每个不同的salt执行此操作

保守salt秘密的理论优势是使攻击更加昂贵,因为攻击者还必须为每个可能的密码尝试所有可能的salt

然而,实际上,一旦他能够访问服务器A,他就可能能够访问服务器B

如果某个东西看起来像散列,可能并不重要。一旦服务器遭到破坏,攻击者可能会发现使用了哪些混淆技术


另一方面:SHA-512产生512位输出,即64个ASCII字符。

这种方法的第一个问题是您正在实现自己的加密代码。这几乎总是一个坏主意;加密很难,而且很容易以微妙的方式搞砸,其他人已经投入了大量的时间和精力来实现构建在加密原语和服务之上的加密原语和服务,因此您不必这样做。但是为了便于讨论,让我们假设您确实需要这样做:-

第二件事是,你正在截断用户的输入——扔掉宝贵的熵——一点好处也没有。您准备生成最多128个字符的盐;为什么不总是这样做,并将它们与密码一起输入到您的哈希中?截断会带来什么好处?我看到的唯一答案是,假设原始密码看起来像散列,因为它是128个字符,但这根本不是真的;您的salt密码仍然以实际密码数据开始,这通常看起来与哈希非常不同

第三件事——可能是我没能正确理解你的想法——是不清楚你的盐是从哪里来的。你把它们描述为随机的,并说攻击者不会知道它们;但是,您的身份验证系统是如何获得它们的呢?看起来它们是从密码派生出来的,但在这种情况下,satting+hash只是一个稍微复杂一些的hash函数,而您实际上并没有得到任何东西


您显然拒绝或可能没有遇到的一般原则是:始终在设计密码系统时假设攻击者知道他们可能知道的一切,包括您的所有源代码。这是一个好原则,你不应该拒绝它。依靠一个小的额外的模糊层不会很好地为你服务;在最坏的情况下,它会使系统复杂化,并导致错误安全感。这种方法的第一个问题是您正在实现自己的密码。这几乎总是一个坏主意;加密很难,而且很容易以微妙的方式搞砸,其他人已经投入了大量的时间和精力来实现构建在加密原语和服务之上的加密原语和服务,因此您不必这样做。但是为了便于讨论,让我们假设您确实需要这样做:-

第二件事是,你正在截断用户的输入——扔掉宝贵的熵——一点好处也没有。您准备生成最多128个字符的盐;为什么不总是这样做,并将它们与密码一起输入到您的哈希中?截断会带来什么好处?我看到的唯一答案是,假设原始密码看起来像散列,因为它是128个字符,但这根本不是真的;您的salt密码仍然以实际密码数据开始,这通常看起来与哈希非常不同

第三件事——可能是我没能正确理解你的想法——是不清楚你的盐是从哪里来的。你把它们描述为随机的,并说攻击者不会知道它们;但是,您的身份验证系统是如何获得它们的呢?看起来它们是从密码派生出来的,但在这种情况下,satting+hash只是一个稍微复杂一些的hash函数,而您实际上并没有得到任何东西


您显然拒绝或可能没有遇到的一般原则是:始终在设计密码系统时假设攻击者知道他们可能知道的一切,包括您的所有源代码。这是一个好原则,你不应该拒绝它。依靠一个小的额外的模糊层不会很好地为你服务;在最坏的情况下,它会使系统复杂化,并导致错误安全感。首先,我没有实现我自己的
加密代码,示例使用SHA512。其次,其目的是截断然后添加随机数据,从而增加自定义熵,从而修改实际密码。由于原始用户密码被截断/追加,如果用户使用相同的密码,它将不适用于Facebook。第三,salt生成并保存在服务器B中。为了进行身份验证,应用程序将截断输入,从服务器B获取salt并比较哈希。我同意一般原则,但本例假设只有哈希表被破坏。如果整个系统确实被破坏了,那么反转哈希表是没有用的,因为攻击者基本上得到了他需要的所有信息。本例假设在哈希表被反转的事件中,原始用户密码将永远不会被显示,因为系统截断/追加了它。攻击者能够完全恢复原始密码的唯一机会是,如果他能够窃取所有系统,包括服务器A、服务器B和应用程序代码。IMB,即使您使用SHA512作为原语,您也在实现自己的密码。不仅仅是最底层的原语是重要的、微妙的,而且很容易出错。第二,不带截断的追加获得了您提到的不带成本的截断带来的所有好处。第三,如果B受损,那么所有的盐都是已知的,不管怎样,如果A或B受损,那么在实践中,另一个也可能受损。第四,不需要原始密码,因为系统只使用截断后的密码位。事实上,如果您截断此系统的密码并真正丢弃截断的密码,那么从系统恢复的数据对危害其他系统的作用将降低。在实践中,我怀疑这一点的实用性,尤其是因为一个用户的密码实际上是通过截断100个字符来更改的,很可能在您的系统中使用的密码与Facebook的密码不同。首先,我没有实现我自己的密码,该示例使用SHA512。其次,其目的是截断然后添加随机数据,从而增加自定义熵,从而修改实际密码。由于原始用户密码被截断/追加,如果用户使用相同的密码,它将不适用于Facebook。第三,salt生成并保存在服务器B中。为了进行身份验证,应用程序将截断输入,从服务器B获取salt并比较哈希。我同意一般原则,但本例假设只有哈希表被破坏。如果整个系统确实被破坏了,那么反转哈希表是没有用的,因为攻击者基本上得到了他需要的所有信息。本例假设在哈希表被反转的事件中,原始用户密码将永远不会被显示,因为系统截断/追加了它。攻击者能够完全恢复原始密码的唯一机会是,如果他能够窃取所有系统,包括服务器A、服务器B和应用程序代码。IMB,即使您使用SHA512作为原语,您也在实现自己的密码。不仅仅是最底层的原语是重要的、微妙的,而且很容易出错。第二,不带截断的追加获得了您提到的不带成本的截断带来的所有好处。第三,如果B受损,那么所有的盐都是已知的,不管怎样,如果A或B受损,那么在实践中,另一个也可能受损。第四,不需要原始密码,因为系统只使用截断后的密码位。事实上,如果您截断此系统的密码并真正丢弃截断的密码,那么从系统恢复的数据对危害其他系统的作用将降低。实际上,我怀疑这一点的效用,不仅仅是因为密码被截断为100个字符的用户很可能在你的系统中使用的密码与Facebook的密码不同。我同意,关键是要减缓散列反转,我相信通过模糊性增加安全性会在原始加密散列的基础上增加一层额外的慢度。这里的要点是让攻击者在整个折磨过程中头疼。所有的希望都不会轻易失去,因为攻击者必须面对几堵墙:1。破坏服务器A.2。破坏服务器B.3。泄露应用程序代码。4.反转散列。5.找出盐和杂烩的关系。6.如果他发现应用程序代码截断/附加了一堆随机字符,他最终会意识到他永远不会知道原始用户密码。现在我不确定其他人,但这个过程非常缓慢。我同意,关键是要减缓散列反转,我相信通过模糊性增加安全性会在原始加密散列的基础上增加一层额外的缓慢性。这里的要点是让攻击者在整个折磨过程中头疼。所有的希望都不会轻易失去,因为攻击者必须面对几堵墙:1。破坏服务器A.2。
破坏服务器B.3。泄露应用程序代码。4.反转散列。5.找出盐和杂烩的关系。6.如果他发现应用程序代码截断/附加了一堆随机字符,他最终会意识到他永远不会知道原始用户密码。现在我不确定其他人,但这个过程非常缓慢。我没有发明任何东西,这个例子使用的是SHA512。我只是在上面添加了更高级别的实现。在本例中,底层加密散列是SHA512,这意味着我可以用bcrypt等替换它。他获得$pass.$salt,但系统在原始过程中截断/附加随机字符,从而永远隐藏原始过程。他也不知道盐是什么,所以他很难判断盐是从哪里开始的。这个例子假设即使失去了所有的希望,也就是说:整个系统都受到了威胁。攻击者永远不会知道原始密码,因为原始密码被截断/追加,因此如果在其他系统(如Facebook/Banking/Email/etc)中尝试,则毫无用处。SHA512,至少在PHP中生成128个字符。我没有发明任何东西。您关于变长填充等的所有想法都是一种新的加密系统。bcrypt是专门为密码设计的,所以您不必担心添加一个salt等等,您只需使用它。隐藏原始密码永远知道$pass。$salt意味着攻击者只需猜测密码的长度。这需要大约50次尝试,他完成了!如果服务器A可以从服务器B查询密码,并且服务器A被破坏,那么没有理由认为服务器B不会被破坏。我没有发明任何东西,本例使用的是SHA512。我只是在上面添加了更高级别的实现。在本例中,底层加密散列是SHA512,这意味着我可以用bcrypt等替换它。他获得$pass.$salt,但系统在原始过程中截断/附加随机字符,从而永远隐藏原始过程。他也不知道盐是什么,所以他很难判断盐是从哪里开始的。这个例子假设即使失去了所有的希望,也就是说:整个系统都受到了威胁。攻击者永远不会知道原始密码,因为原始密码被截断/追加,因此如果在其他系统(如Facebook/Banking/Email/etc)中尝试,则毫无用处。SHA512,至少在PHP中生成128个字符。我没有发明任何东西。您关于变长填充等的所有想法都是一种新的加密系统。bcrypt是专门为密码设计的,所以您不必担心添加一个salt等等,您只需使用它。隐藏原始密码永远知道$pass。$salt意味着攻击者只需猜测密码的长度。这需要大约50次尝试,他完成了!如果服务器A可以从服务器B查询密码,而服务器A被破坏,那么就没有理由认为服务器B不会被破坏。散列的要点是你不能撤销它。@zimdanen同意,但通过彩虹/字典攻击是可逆的,这就是你想要盐的原因,但是,正如你和答案提到的,盐不需要保密。散列本身将为数据保密;盐只是增加了计算彩虹表的复杂性。@zimdanen你是对的,但我想你会同意,如果盐被隐藏,你将进一步延长黑客的痛苦。否则,如果他知道这一点,那么他的苦难现在就领先了一步。这完全是一场让攻击者越来越难对付的游戏。然而,我认为该系统中可能还有其他问题需要更多关注。例如,最好集中精力让攻击者远离系统;“散列的要点是你不能逆转它。”zimdanen同意,但通过彩虹/字典攻击它是可逆的,这就是你想要盐的原因,但是,正如你和答案所提到的,盐不需要保密。散列本身将为数据保密;盐只是增加了计算彩虹表的复杂性。@zimdanen你是对的,但我想你会同意,如果盐被隐藏,你将进一步延长黑客的痛苦。否则,如果他知道这一点,那么他的苦难现在就领先了一步。这完全是一场让攻击者越来越难对付的游戏。然而,我认为该系统中可能还有其他问题需要更多关注。例如,最好集中精力让攻击者远离系统;