Cryptography 除了使用bcrypt密码散列的随机项级盐外,使用全局密钥是否还有总体优势?

Cryptography 除了使用bcrypt密码散列的随机项级盐外,使用全局密钥是否还有总体优势?,cryptography,php-5.3,password-protection,bcrypt,Cryptography,Php 5.3,Password Protection,Bcrypt,我在PHP5.3中使用bcrypt进行密码哈希+ 我知道bcrypt使用一个随机salt,该salt被构建到每个项目的结果散列中。这使得破解每个散列变得困难,并防止了破解 我不知道的是,是否仍然有充分的理由使用附加的应用程序级全局密钥。 例如,不只是将密码字符串散列,例如“password1”与bcrypt生成系统中内置的随机salt一起放入bcrypt散列(根据此处:): $2a$08$MJQAZ5CZI5B9U6ZPU4MGURCVTXR1K.9ncYpxCdG.YhlD8yFG2mXK 我

我在PHP5.3中使用bcrypt进行密码哈希+

我知道bcrypt使用一个随机salt,该salt被构建到每个项目的结果散列中。这使得破解每个散列变得困难,并防止了破解

我不知道的是,是否仍然有充分的理由使用附加的应用程序级全局密钥。 例如,不只是将密码字符串散列,例如“password1”与bcrypt生成系统中内置的随机salt一起放入bcrypt散列(根据此处:): $2a$08$MJQAZ5CZI5B9U6ZPU4MGURCVTXR1K.9ncYpxCdG.YhlD8yFG2mXK

我还可以创建一个常量,例如:“@#$%%$%&BDFGG@$%BNG$Y^$%SEHYSZTHN$%”,将该常量放入应用程序(应用程序源代码或应用程序的配置文件),并将其附加到任何要散列的字符串中。 因此,“password1”+“@#$%$%&BDFGG@$%BNG$Y^$%SEHYSZTHN$%”->将被散列到不同的散列中,而不仅仅是“password1”。 $2a$08$xFGULSRPOYLBXP1IG3H8.KDVGYHM4ATQRP2PTU25NMBUJBDRRK

显然,在应用程序本身的上下文中,这没有多大帮助。如果有人在运行的系统上尝试密码“password1”,他们会成功,因为他们会自动获得全局密钥。但是,如果他们只有数据库或对数据库的访问权限,那么似乎全局密钥可能是一个额外的障碍?因为,在不知道全局密钥的情况下,他们必须破解“password1@#$%$%&BDFGG@$%BNG$Y^$%SEHYSZTHN$%”,而不仅仅是破解“password1”

我可以想象,可能存在一些潜在的好处:

  • 这可能真的会妨碍仅使用受损数据库来破解哈希
以及可能存在的一些模糊的缺点:

  • 这将为所有得到散列的字符串引入一个公共线程,如果已知散列,则可能更容易破解散列
  • 它增加了数据的脆弱性。如果全局密钥丢失,例如在服务器迁移或其他过程中,则数据现在是垃圾

所以我想弄清楚是否也有一个全局密钥是个好主意,或者每个项目的随机盐是否足够,以及您想要的一切。有人知道任何使用全局密钥的实现,或者有研究建议使用它吗?盐和拉伸的目的是让黑客很难破解PWD如果他们访问数据库

如果你在应用程序中添加了一个额外的全局salt,那么你基本上是在应用程序和数据库之间分配登录过程,这使得事情变得更加复杂,并为攻击打开了更多的场所

你将在数据库中存储什么,哈希是否包含全局salt?然后,在登录过程中,你将在数据库和应用程序之间传输什么?无论如何,应用程序和数据库之间的通信应该是安全的(否则,你的盐分系统很容易被中间人破坏)

如果黑客只访问数据库而不访问应用程序,可能会有一点好处,但老实说,这在今天是一个非常小的不现实的案例。黑客会在你的数据库之前访问你的应用程序。这不值得付出努力。而且,我甚至可能是错的

很多时候,当涉及到安全性时,人们会想到“新”的想法,但最终被黑客粉碎,因为角落案例没有得到正确的识别和研究。这是密码学中的一个经典。成千上万的想法都戏剧性地失败了,让使用它们的人付出了巨大的痛苦。在密码学中,创造力是一种负担


坚持经典的安全通信+随机项级salt方案。

salt的唯一目的是击败预计算攻击(如彩虹表)。您所描述的“全局salt”实际上是一个密钥


对于这是否有用众说纷纭。它帮助防御的唯一威胁模型是攻击者可以获取数据库内容,但无法访问您的源代码。就个人而言,我认为这是一个足够小的可能性,即防御它是不必要的,并且需要付出大量的努力才能实现正确地操作是没有根据的。

公平地说,我喜欢全局密钥与全局salt这两个更清晰的术语。我同意这种情况仅适用于服务器本身未被破坏的攻击面(或至少应用程序源代码和应用程序配置文件)。然而,我发现这是一个相当大的可能性。首先,使用sql注入工具,有可能使用一个未闭合的孔绘制出数据库中的所有数据和结构。数据库备份也是如此。然而,如果服务器受损,所有数据都将丢失。@Tchalvak如我所说,观点不同但是,如果您的站点存在SQL注入漏洞,攻击者至少可以执行其他操作,如将自己升级为管理员(这将为他们提供其他可利用的途径)。如果您的输入数据没有经过净化,可能还有其他方法可以说服您的服务器放弃他们想要的信息。如果正确应用了盐渍哈希,则不允许您构造未盐渍哈希,因此,使用盐渍的另一个好处是,即使盐渍受损,也可以防止使用彩虹表进行攻击。@Paul OP描述的“全局salt”只会阻止使用通用彩虹表;攻击者仍然可以构造特定于站点的表。当然,这会使事情变得更复杂,不确定“不必要”部分。散列将存储在数据库中。全局salt将存储在应用程序配置文件中/(Nick Johnson称之为密钥)将被存储。不过,“您的实现可能会引入不安全性”的论点有点令人信服。