首页 > 后端开发 > php教程 > 密码哈希的风险和挑战

密码哈希的风险和挑战

尊渡假赌尊渡假赌尊渡假赌
发布: 2025-02-22 08:36:11
原创
798 人浏览过

密码哈希的风险和挑战

钥匙要点

  • 散列是一个单向函数,可将可变长度数据映射到固定长度输出,但由于已知的漏洞和碰撞的可行性,MD5和SHA-1(例如MD5和SHA-1)(如MD5和SHA-1)等简单的哈希算法很容易受到攻击。>>>>>>>>>>>>>>。
  • 腌制密码在哈希之前为每个密码增加了一个独特的价值,通过防止攻击(例如彩虹桌和蛮力)来增强安全性,但必须安全地存储盐以防止剥削。
  • >
  • 密码拉伸通过迭代多次划定密码来提高安全性,该密码延迟了破解的尝试,使蛮力攻击更加耗时且不可行。
  • >使用强大的现代哈希算法(例如SHA-256或BCRYPT),以及实施诸如盐和伸展等技术,对于增强密码安全至关重要。
  • 尽管哈希技术的增强功能,但由于计算能力和技术的进步潜力,没有任何方法完全是万无一失的,因此强调了对密码存储策略进行连续更新和评估的需求。
  • >
  • 在过去的文章中,讨论了密码哈希作为将用户凭据安全存储在应用程序中的一种方式。 安全始终是一个非常有争议的话题,非常相似的政治和宗教,在这里,存在许多观点,对于某人来说,“完美的解决方案”对他人不一样。 我认为,违反应用程序的安全措施只是时间问题。随着计算机功率和复杂性每天增加,今天的安全应用程序将不会那么安全。 对于不熟悉Hash算法的读者而言,它无非是一种单程函数,将可变长度的数据映射到固定长度的数据。 因此,如果我们分析上述定义,我们需要了解此类算法的以下要求和特征:>
  • 一种方式函数:无法使用有效的算法逆转输出。>
可变长度的数据映射到固定长度的数据:这意味着输入消息空间可以是“无限”,但输出空间不是。 这意味着2个或多个输入消息可以具有相同的哈希。输出空间越小,两个输入消息之间“碰撞”的概率越大。

MD5已确认实用的碰撞和SHA1达到碰撞的概率每天都在增长(可以通过分析经典生日问题来找到碰撞概率的更多信息),因此,如果我们需要应用哈希算法,我们应该使用散布的算法,我们应该使用具有更大的输出空间(以及可忽略不计的碰撞概率),例如SHA256,SHA512,漩涡等

>它们也称为“伪随机函数”,这意味着哈希功能的输出应与真实的随机数生成器(或trng)无法区分。

为什么简单的哈希是存储密码的不安全

不能使用有效算法将哈希函数的输出回到输入的事实并不意味着不能破解它。 简单的Google搜索通常在我们的范围内包含包含通用单词和短字符串的哈希的数据库。另外,通过字典攻击,常见的弦可以轻松,快速地刺激或破裂。

示例

这是一个快速视频,介绍了SQLMAP之类的工具如何通过在数据库中刺激MD5哈希来通过SQL注入来破解密码。

>

>此外,我们本来可以做到的最简单的攻击……只需抓住哈希杂志和谷歌搜索……很可能存在在线数据库中。哈希数据库的示例是:

    http://www.hash-database.net/
  • https://isc.sans.edu/tools/hashsearch.html
  • http://md5online.net/
  • https://crackstation.net/
>我们还必须考虑到,由于2个或更多相同的密码确实具有相同的哈希值,因此破解一个哈希会自动为您提供每个使用相同用户的密码。 只是要明确,说您有成千上万的用户,很可能会使用大量的使用(如果没有执行密码策略)臭名昭著的“ 123456”密码。 该密码的MD5哈希值是“ E10ADC3949BA59ABBE56E057F20F883E',因此,当您破解此哈希(如果您必须这样做)并搜索所有在其密码字段中具有此值的用户时,您会知道他们每个人都使用的每个用户都使用'123456'密码。

为什么盐的哈希是存储密码的不安全

为了减轻这种攻击,盐变得很普遍,但显然不足以使当今的计算能力不足,尤其是在盐弦短的情况下,这使得它可以野蛮。

基本密码/盐功能定义为:

f(密码,盐)=哈希(密码盐)

为了减轻蛮力攻击,盐应长达64个字符,但是,为了稍后对用户进行身份验证,必须将盐存储在数据库内的纯文本中,因此:

>由于每个用户都会有完全不同的盐,因此也可以避免简单哈希的问题,我们可以轻松判断2个或更多用户是否使用相同的密码;现在哈希将有所不同。我们也无法直接获取密码哈希并尝试将其谷歌搜索。同样,有了较长的盐,蛮力攻击是不可能的。但是,如果攻击者可以通过SQL注入攻击或直接访问数据库来访问此盐,则可能可能是蛮力或字典攻击,尤其是当您的用户使用常见密码(再次,例如'123456')时:

<span>if (hash([provided password] + [stored salt]) == [stored hash]) then user is authenticated</span>
登录后复制
登录后复制
登录后复制
>但是,即使一个密码被破解,也不会自动为您使用它的每个用户提供密码,因为任何用户都不应具有相同的存储hash。

随机性问题

为了生成良好的盐,我们应该有一个良好的随机数生成器。 如果php的rand()函数自动在您的脑海中弹出,请立即忘记它。

>

>有一篇关于Random.org中随机性的出色文章。 简而言之,计算机本身无法对随机数据进行思考。据说计算机是确定性的机器,这意味着计算机能够运行的每种算法都可以在完全相同的输入中运行,始终会产生相同的输出。

>当将随机数要求到计算机时,通常会从多个来源获取输入,例如环境变量(日期,时间,字节,读取/书面读取,正常运行时间…),然后在它们上应用一些计算以产生随机

数据。 这就是为什么由算法给出的随机数据称为伪随机的原因,因此与真实的随机数据源区分开很重要。 如果我们能够在执行伪随机数生成器(或PRNG)时重新创建存在的确切条件,则我们将自动具有原始生成的数字。 此外,如果未正确实现PRNG,则可以在生成的数据中发现模式。 如果存在模式,我们可以预测结果…以此处记录的窗口上的php rand()函数的情况。 虽然尚不清楚使用了哪个PHP或Windows版本,但您可以立即通过使用RAND()生成的位图来确定出现问题,

与来自TRNG的输出图像进行比较:

密码哈希的风险和挑战

即使该问题已在php> = 5上解决,rand()甚至MT_RAND()仍然被认为是出于安全相关目的而被认为是高度不足的。

> 密码哈希的风险和挑战如果您需要生成随机数据,请使用openssl_random_pseudo_bytes()在php 5> = 5.3.0起可用的,它甚至具有Crypto_strong标志,它将告诉您字节是否足够安全。

这是一个快速的代码示例,可以使用openssl_random_pseudo_bytes()

生成随机字符串

密码伸展可能会有效,如果正确完成

>为了进一步减轻蛮力攻击,我们可以实施密码拉伸技术。 这只是一种迭代或递归算法,它本身可以一遍又一遍地计算哈希值,通常数万次(或更多)。
<span>if (hash([provided password] + [stored salt]) == [stored hash]) then user is authenticated</span>
登录后复制
登录后复制
登录后复制

该算法应足够迭代以在至少1秒内执行所有计算(较慢的哈希也意味着攻击者必须等待)。

为了破解通过拉伸保护的密码,攻击者应该:>

  1. 知道确切的迭代计数,任何偏差都会产生完全不同的哈希。
  2. 每次尝试之间应至少等待1秒钟。
  3. 这使攻击不可能……但并非不可能。为了克服1秒的延迟,攻击者的硬件规格应比对算法进行调整的计算机的高硬件规格更高,这可能意味着高成本,因此攻击变得非常昂贵。
您还可以使用标准算法,例如PBKDF2,它是基于密码的键推导函数>

也有时间和记忆密集型算法(例如bcrypt)

$ $成本是工作因素,而$盐是您可以使用Secure_rand()函数生成的随机字符串。
<span>if (hash([provided password] + [stored salt]) == [stored hash]) then user is authenticated</span>
登录后复制
登录后复制
登录后复制
工作负载因子完全取决于目标系统。您可以从“ 09”开始,然后将其增加,直到操作完成约为。 1秒。

>从php 5> = 5.5.0起
<span>Generate some string or get entry from dictionary
</span><span>Concatenate with salt
</span><span>Apply hash algorithm
</span><span>If generated hash == hash in database then Bingo
</span><span>else continue iterating</span>
登录后复制
> PHP中还没有SCRYPT支持,但是您可以查看Domblack的Scrypt实现。

应用加密技术怎么样?

>散列和密码(或加密

)是通常会感到困惑的术语。正如我之前提到的,哈希是一种伪随机函数,而密码通常为

'pseudo-random置换式'>。这意味着将输入消息切成薄片和更改,以使输出与TRNG无法区分,但是可以将输出再次转换回原始输入。这种转换是使用加密密钥进行的,没有该密钥,就不可能再次将输出转换为原始消息。 与哈希相比,还有另一个很大的差异。虽然哈希的输出消息空间是有限的,但密封输出消息空间是无限的,因为输入和输出之间的关系为1:1,因此不存在碰撞。

>必须非常谨慎地在如何正确应用加密技术时,认为仅通过将加密算法应用于敏感数据就足以确保安全性是错误的,因为存在许多可能导致数据泄漏的问题。通常,您绝不应该考虑应用自己的加密实施

最近,Adobe对用户数据库有大量数据泄漏,因为它们不正确地应用了加密技术,我将以它们为例。 我会尽量直截了当,使事情变得非常简单。

>

考虑以下架构:

假设表的纯文本内容如下:>

现在,Adobe的某人决定密码密码,但犯了两个大错误:

  1. 使用相同的密码来加密密码
  2. 决定将密码提示字段留在纯文本

例如,假设在将加密算法应用于密码字段之后,现在我们的数据看起来如下:

密码哈希的风险和挑战

>虽然密码无法简单地解密,并且通过检查数据,我们可能会发现记录2和7共享相同的密码,以及3和6…,我们无法以简单的方式知道使用的加密密钥。这是密码提示字段发挥作用的地方。

>

记录6提示是“我是一个!”>没有给我们太多信息,但是记录3的提示确实如此……我们可以肯定地猜测密码是“女王”。 记录2和7个提示并不能单独提供很多信息,但是如果我们一起看它们,那么有多少个假期与可怕的电影相同?现在,我们可以访问所有使用“万圣节”作为密码的每个人的帐户。

> 为了减轻数据泄漏的风险,最好切换到哈希技术,但是,如果您必须使用加密技术来存储密码,我们可以使用可调整的加密。这个术语看起来很花哨,但是很简单。

>假设我们有成千上万的用户,我们想加密所有密码。 如我们所见,我们不能为每个密码使用相同的加密密钥,因为数据将处于风险状态(并且其他复杂的攻击将成为可能)。 但是,我们不能为每个用户使用一个唯一的密钥,因为存储这些密钥本身将成为安全风险。 我们要做的是生成一个键,并使用每个用户唯一的'tweak'>'tweak'>,并且键和调整都将是每个记录的加密密钥。可用的最简单的调整是主要键,从定义上讲,该键是表中的每个记录所独有的(尽管我不建议使用它,但这仅仅是为了演示概念):>

f(键,primarykey)=键prientarkey 上面的我只是简单地将加密密钥和主密钥的值加成,以生成最终的加密密钥,但是您可以(

和应该)应用哈希算法或密钥推导函数。另外,您可能需要生成一个nonce(类似于盐),而不是将主键用作调整,以使每个记录用作调整。

在将可调整加密应用于用户表后,现在看起来如下:>

>当然我们仍然有密码提示问题,但是现在每个记录都有一个唯一的值,因此尚不明显使用哪些用户使用相同的密码。

>我想强调的是,加密不是最好的解决方案,如果可能会注入很多弱点,应避免存储密码……您可以并且应该坚持使用已验证的解决方案(例如BCRypt)来存储密码,但是请记住,即使是经过验证的解决方案也有自己的弱点。

结论

>没有完美的解决方案,并且每天都有破坏我们的安全措施的风险。但是,密码和数据安全研究和研究继续进行,随着海绵功能的相对定义,我们的工具包一直在增长。

>密码哈希

上的常见问题(常见问题解答)

密码哈希和加密之间有什么区别?

>密码哈希和加密是使用两个不同的方法来保护数据,但它们具有不同的目的。加密是一个双向函数。可以用适当的键解密加密的内容。这意味着,如果有人获得对加密密钥的访问,则可以解密数据。另一方面,哈希是一个单向函数,它会拼写纯文本以产生独特的消息摘要。即使输入的很小的变化也会产生如此急剧的变化,以至于新的哈希值不像旧的哈希值。这使得不可能从哈希值重新生成原始数据,从而使哈希储存密码更加安全。

>

>密码中的盐如何增强安全性?

>

盐是一个随机数据,用作单向函数的附加输入,该功能可以使用数据,密码或密码。盐用于保护存储中的密码。盐的主要功能是防御字典攻击或预先计算的彩虹桌攻击。通过添加唯一的盐,即使两个用户具有相同的密码,哈希也将成为每个用户的独特之处。这意味着,即使黑客可以访问哈希值,他们也无法在没有唯一盐的情况下破解密码。

>使用弱的哈希算法有什么风险?像MD5和SHA-1一样,也容易受到攻击。它们具有已知的漏洞,并且可以通过现代计算能力相对轻松地破解。例如,它们容易受到碰撞攻击的影响,其中两个不同的输入产生了相同的哈希输出。这损害了数据的完整性。因此,建议使用更强大的哈希算法(如SHA-256或BCRYPT)提供更高级别的安全性。

>

>密码拉伸如何增加安全性?

密码拉伸是一种用于增加的技术存储密码的安全性。这是通过将加密哈希函数以及盐加上盐应用于用户密码的,然后将结果重新限制多次来完成。此过程增加了哈希密码所需的时间,这可以阻止依靠许多快速尝试猜测密码的攻击者。

>

什么是彩虹桌攻击?

>彩虹桌攻击是一种黑客攻击,其中攻击者使用彩虹桌,这是一张用于逆转加密哈希功能的预算表,以破解哈希密码。彩虹表包含加密密码的所有可能的明文排列。此方法可以有效地防止基本的哈希,但是在每个密码上添加独特的盐可以防止彩虹桌攻击。

>为什么将哈希算法秘密保留很重要?保持散列算法的秘密,并非总是可能的,尤其是使用广泛使用的算法。良好的哈希系统的安全不依赖于该算法的保密性;取而代之的是,它取决于添加到哈希的盐的保密性和随机性。即使攻击者知道算法,如果没有盐,他们也无法从哈希(Hash)中逆转密码。

>

>辣椒在密码哈希中有什么作用?添加了一秒钟的秘密盐,以提高存储密码的安全性。虽然通常将盐存储在Hashed密码旁边的数据库中,但通常在应用程序代码中保存胡椒粉并分别保存。这意味着,即使攻击者可以在没有胡椒的情况下获得对数据库的访问权限,他们也无法破解密码。

>

我应该多久更新或更改散列算法?或更改哈希算法取决于几个因素,包括您要保护的数据的敏感性和当前技术状态。根据经验,如果更安全的哈希算法被广泛接受,或者在当前算法中发现漏洞,则该更新了。请始终了解密码学的最新发展,以确保最大的安全性。

>哈希功能对我的应用程序性能有什么影响?

hash功能,尤其是安全的功能,可以是计算上的密集,可能会影响您的应用程序的性能。但是,与安全福利相比,这种影响通常可以忽略不计。由安全的哈希功能造成的延迟实际上可以作为对攻击者的威慑作用,因为它减慢了猜测密码的尝试。

>我如何确保用户密码的最大安全性?为确保用户密码的最大安全性,请遵循以下最佳实践:使用强,安全和最新的哈希算法;在每个密码哈希中添加独特的盐;考虑添加胡椒粉;并实现密码拉伸。此外,为您的用户执行强密码策略,例如最小长度以及字符,数字和符号的混合

以上是密码哈希的风险和挑战的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板