Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security 什么';在MD5这样的散列上使用蛮力有什么大不了的_Security_Hash_Cryptography_Md5_Sha1 - Fatal编程技术网

Security 什么';在MD5这样的散列上使用蛮力有什么大不了的

Security 什么';在MD5这样的散列上使用蛮力有什么大不了的,security,hash,cryptography,md5,sha1,Security,Hash,Cryptography,Md5,Sha1,我只是花了一些时间阅读(我强烈推荐!) 在这本书中,它讨论了散列冲突。也许我在这里遗漏了一些东西,但是你不能只使用MD5加密你的密码,然后使用SHA-1(或者任何其他的,没关系)。这难道不会增加强制哈希和减少冲突的可能性所需的处理能力吗?首先,MD5和sha1不是加密函数,它们是消息摘要函数。此外,在现实世界中,大多数散列都是使用诸如和之类的字典攻击破坏的 John The Ripper最适合攻击者知道salt值的salt密码。Rainbow Crack适用于含有少量未知盐和直接散列的密码,如m

我只是花了一些时间阅读(我强烈推荐!)


在这本书中,它讨论了散列冲突。也许我在这里遗漏了一些东西,但是你不能只使用MD5加密你的密码,然后使用SHA-1(或者任何其他的,没关系)。这难道不会增加强制哈希和减少冲突的可能性所需的处理能力吗?

首先,MD5和sha1不是加密函数,它们是消息摘要函数。此外,在现实世界中,大多数散列都是使用诸如和之类的字典攻击破坏的

John The Ripper最适合攻击者知道salt值的salt密码。Rainbow Crack适用于含有少量未知盐和直接散列的密码,如
md5($pass)


Rainbow Crack需要很长时间来构建表,但之后密码会在几秒钟内被破解。这取决于磁盘驱动器的速度

散列是一种“通过模糊处理进行加密”,这并不是最佳实践。你是对的,理论上它可以“减少”碰撞的可能性,但它可能不会消除这种可能性。更重要的是,散列函数并不是真正的加密函数,谷歌“散列vs加密”提供了数百种解释。

当您对密码进行多次散列时,实际上会增加散列冲突的机会,因此最佳做法是只进行一次散列

它也与执行暴力攻击的容易程度无关。这种攻击将系统地尝试给定范围内的所有可能密码。因此,如果您的密码是“foobar”,并且攻击测试了密码“foobar”,那么无论您对密码进行了多少次散列,都无关紧要,因为暴力攻击成功地猜到了密码

因此,如果您希望防范暴力攻击,您可以限制用户尝试授权的频率或要求密码超过一定长度


在旁注上;Rainbow表和类似的方法被黑客使用,他们已经获得了对您数据库的访问权,并打算解密存储的密码。为了使这种攻击更加困难,您应该使用静态和动态盐。

您正在讨论两个不同(尽管相关)的问题。第一个是可能发生冲突,第二个是能够对大量值运行算法,以找到创建哈希的原始值

  • 碰撞。如果运行sha1(md5(text)),则首先获取md5的哈希值,然后将其传递给sha1。假设sha1函数有128位输出,md5也有128位输出。md5函数中发生冲突的几率为1/2^128。那么您在sha1中发生碰撞的几率是1/2^128。如果其中一个发生碰撞,则函数整体发生碰撞,因此结果为
    (1/2^128)+(1/2^128)
    1/2^127
  • 暴力强迫。运行sha1(md5(text))只会使查找原始字符串所需的时间增加一倍。这与安全无关。例如,如果每个算法都有128位的输出空间,暴力破解需要1小时,那么同样的暴力破解需要2小时才能获得原始字符串。这与将输出空间增加到129位相同。但是,如果您真的想让暴力强制变得不可能,那么您必须做的是将输出大小增加一倍(这可以与加密中的密钥大小进行比较) 碰撞攻击(例如,针对MD5的已知类型)没有真正的好处。为了对密码有效,您需要预映像攻击(即,能够找到将散列到已知散列码的输入)。尽管已知有针对MD5的前映像攻击,但它们目前并不实用


    碰撞攻击用于完全不同的目的。已经执行的一个示例是为两个冲突的不同身份创建两个X.509证书。提交一个由证书颁发机构签名,然后您可以使用另一个声明您完全是另一个人。由于哈希将与第一个冲突,当/如果用户尝试验证证书时,它将显示为已验证。

    首先不使用哈希函数创建消息摘要

    你的问题:

    但是你不能只加密(散列)你的 使用MD5密码,然后, 比如说,SHA-1(或任何其他,都不会 重要的事。)

    如果散列函数不提供这些属性中的任何一个,则不管您散列多少次,攻击者也可以散列n次以获得冲突

  • 对于任何给定的代码h,在计算上不可能找到 使得H(x)=H,这个性质是 称为单向或预映像抵抗

  • 对于任何给定的块x,计算上不可能找到y≠x H(y)=H(x)。此属性为 参考的第二个前映像抵抗或 弱抗碰撞

  • 计算上不可能找到任何梨(x,y)这样 H(x)=H(y)。这就是所谓的坚强 抗碰撞

  • 正如Rook提到的,通过为每个用户添加不同的salt值来存储密码。如果攻击者利用密码文件进行攻击,则字典会变长,计算开销和时间也会变长

    假设攻击者拥有密码的散列值,并开始从字典文件中读取并与散列值进行比较(如果匹配),则pasword被破解,如果使用了salt,则从字典中读取并添加一些salt值,然后尝试查找匹配项。但这应该为每个用户执行。所以salt增加的复杂性是(来自维基百科)

    假设用户的(加密)密钥 他被偷了,而且他用过一个 20万欧元
    if H(password+salt)(in system)=H(Your password+salt) (login process)
    login else
    print<<error