MD5已确认实用的碰撞和SHA1达到碰撞的概率每天都在增长(可以通过分析经典生日问题来找到碰撞概率的更多信息),因此,如果我们需要应用哈希算法,我们应该使用散布的算法,我们应该使用具有更大的输出空间(以及可忽略不计的碰撞概率),例如SHA256,SHA512,漩涡等
>它们也称为“伪随机函数”,这意味着哈希功能的输出应与真实的随机数生成器(或trng)无法区分。
不能使用有效算法将哈希函数的输出回到输入的事实并不意味着不能破解它。 简单的Google搜索通常在我们的范围内包含包含通用单词和短字符串的哈希的数据库。另外,通过字典攻击,常见的弦可以轻松,快速地刺激或破裂。
示例>
>此外,我们本来可以做到的最简单的攻击……只需抓住哈希杂志和谷歌搜索……很可能存在在线数据库中。哈希数据库的示例是:
为什么盐的哈希是存储密码的不安全
f(密码,盐)=哈希(密码盐)
为了减轻蛮力攻击,盐应长达64个字符,但是,为了稍后对用户进行身份验证,必须将盐存储在数据库内的纯文本中,因此:
>由于每个用户都会有完全不同的盐,因此也可以避免简单哈希的问题,我们可以轻松判断2个或更多用户是否使用相同的密码;现在哈希将有所不同。我们也无法直接获取密码哈希并尝试将其谷歌搜索。同样,有了较长的盐,蛮力攻击是不可能的。但是,如果攻击者可以通过SQL注入攻击或直接访问数据库来访问此盐,则可能可能是蛮力或字典攻击,尤其是当您的用户使用常见密码(再次,例如'123456')时:
<span>if (hash([provided password] + [stored salt]) == [stored hash]) then user is authenticated</span>
>
>有一篇关于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>
为了破解通过拉伸保护的密码,攻击者应该:
应用加密技术怎么样? >散列和密码(或加密 'pseudo-random置换式'>。这意味着将输入消息切成薄片和更改,以使输出与TRNG无法区分,但是可以将输出再次转换回原始输入。这种转换是使用加密密钥进行的,没有该密钥,就不可能再次将输出转换为原始消息。
与哈希相比, >必须非常谨慎地在如何正确应用加密技术时,认为仅通过将加密算法应用于敏感数据就足以确保安全性是错误的,因为存在许多可能导致数据泄漏的问题。通常,您绝不应该考虑应用自己的加密实施
假设表的纯文本内容如下: 现在,Adobe的某人决定密码密码,但犯了两个大错误: 例如,假设在将加密算法应用于密码字段之后,现在我们的数据看起来如下: >虽然密码无法简单地解密,并且通过检查数据,我们可能会发现记录2和7共享相同的密码,以及3和6…,我们无法以简单的方式知道使用的加密密钥。这是密码提示字段发挥作用的地方。 记录6提示是“我是一个!”>没有给我们太多信息,但是记录3的提示确实如此……我们可以肯定地猜测密码是“女王”。 记录2和7个提示并不能单独提供很多信息,但是如果我们一起看它们,那么有多少个假期与可怕的电影相同?现在,我们可以访问所有使用“万圣节”作为密码的每个人的帐户。
f(键,primarykey)=键prientarkey
上面的我只是简单地将加密密钥和主密钥的值加成,以生成最终的加密密钥,但是您可以( 在将可调整加密应用于用户表后,现在看起来如下: >当然我们仍然有密码提示问题,但是现在每个记录都有一个唯一的值,因此尚不明显使用哪些用户使用相同的密码。 >我想强调的是,加密不是最好的解决方案,如果可能会注入很多弱点,应避免存储密码……您可以并且应该坚持使用已验证的解决方案(例如BCRypt)来存储密码,但是请记住,即使是经过验证的解决方案也有自己的弱点。
>密码哈希 >密码中的盐如何增强安全性? >使用弱的哈希算法有什么风险?像MD5和SHA-1一样,也容易受到攻击。它们具有已知的漏洞,并且可以通过现代计算能力相对轻松地破解。例如,它们容易受到碰撞攻击的影响,其中两个不同的输入产生了相同的哈希输出。这损害了数据的完整性。因此,建议使用更强大的哈希算法(如SHA-256或BCRYPT)提供更高级别的安全性。 >彩虹桌攻击是一种黑客攻击,其中攻击者使用彩虹桌,这是一张用于逆转加密哈希功能的预算表,以破解哈希密码。彩虹表包含加密密码的所有可能的明文排列。此方法可以有效地防止基本的哈希,但是在每个密码上添加独特的盐可以防止彩虹桌攻击。 >辣椒在密码哈希中有什么作用?添加了一秒钟的秘密盐,以提高存储密码的安全性。虽然通常将盐存储在Hashed密码旁边的数据库中,但通常在应用程序代码中保存胡椒粉并分别保存。这意味着,即使攻击者可以在没有胡椒的情况下获得对数据库的访问权限,他们也无法破解密码。 >哈希功能对我的应用程序性能有什么影响?
您还可以使用标准算法,例如PBKDF2,它是基于密码的键推导函数<span>if (hash([provided password] + [stored salt]) == [stored hash]) then user is authenticated</span>
<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>
>
考虑以下架构:
>没有完美的解决方案,并且每天都有破坏我们的安全措施的风险。但是,密码和数据安全研究和研究继续进行,随着海绵功能的相对定义,我们的工具包一直在增长。
密码哈希和加密之间有什么区别?
>密码哈希和加密是使用两个不同的方法来保护数据,但它们具有不同的目的。加密是一个双向函数。可以用适当的键解密加密的内容。这意味着,如果有人获得对加密密钥的访问,则可以解密数据。另一方面,哈希是一个单向函数,它会拼写纯文本以产生独特的消息摘要。即使输入的很小的变化也会产生如此急剧的变化,以至于新的哈希值不像旧的哈希值。这使得不可能从哈希值重新生成原始数据,从而使哈希储存密码更加安全。
>>密码拉伸如何增加安全性?
密码拉伸是一种用于增加的技术存储密码的安全性。这是通过将加密哈希函数以及盐加上盐应用于用户密码的,然后将结果重新限制多次来完成。此过程增加了哈希密码所需的时间,这可以阻止依靠许多快速尝试猜测密码的攻击者。
>什么是彩虹桌攻击?
>为什么将哈希算法秘密保留很重要?保持散列算法的秘密,并非总是可能的,尤其是使用广泛使用的算法。良好的哈希系统的安全不依赖于该算法的保密性;取而代之的是,它取决于添加到哈希的盐的保密性和随机性。即使攻击者知道算法,如果没有盐,他们也无法从哈希(Hash)中逆转密码。
>我应该多久更新或更改散列算法?或更改哈希算法取决于几个因素,包括您要保护的数据的敏感性和当前技术状态。根据经验,如果更安全的哈希算法被广泛接受,或者在当前算法中发现漏洞,则该更新了。请始终了解密码学的最新发展,以确保最大的安全性。
以上是密码哈希的风险和挑战的详细内容。更多信息请关注PHP中文网其他相关文章!