Php 为什么MD5';给UUID打电话不是个好主意?

Php 为什么MD5';给UUID打电话不是个好主意?,php,cryptography,md5,Php,Cryptography,Md5,PHP有一个生成各种UUID的函数 在使用示例中,它显示了以下内容: $token=md5(uniqid()) 但在评论中: 从唯一ID生成MD5是非常困难的 幼稚,降低了 唯一的ID,以及提供 严重(可攻击的)血管狭窄 MD5域。这是一个深刻的问题 要做的事。正确的 方法是在上使用唯一ID 它自己的;它已经准备好了 无碰撞 为什么这是真的,如果是的话?如果MD5散列对于唯一ID是(几乎)唯一的,那么MD5使用uniqid有什么错?MD5UUID是毫无意义的,因为UUID已经是唯一的、固定长度(

PHP有一个生成各种UUID的函数

在使用示例中,它显示了以下内容:

$token=md5(uniqid())

但在评论中:

从唯一ID生成MD5是非常困难的 幼稚,降低了 唯一的ID,以及提供 严重(可攻击的)血管狭窄 MD5域。这是一个深刻的问题 要做的事。正确的 方法是在上使用唯一ID 它自己的;它已经准备好了 无碰撞


为什么这是真的,如果是的话?如果MD5散列对于唯一ID是(几乎)唯一的,那么MD5使用uniqid有什么错?

MD5UUID是毫无意义的,因为UUID已经是唯一的、固定长度(短)的属性,这正是人们经常使用MD5的一些原因。因此,我认为这取决于您计划如何使用UUID,但一般来说,UUID具有与MD5中的某些数据相同的属性,那么为什么两者都有呢?

UUID是128位宽的,并且具有生成方式固有的唯一性。MD5散列是128位宽的,不能保证唯一性,只有很低的冲突概率。MD5散列不小于UUID,因此它对存储没有帮助

如果您知道散列来自UUID,那么攻击就容易得多,因为如果您知道生成UUID的机器的任何信息,那么有效UUID的域实际上是相当可预测的

如果您需要提供一个安全令牌,那么您将需要使用一个(1)UUID。UUID不是设计为加密安全的,只是保证唯一。由唯一的机器标识符(通常是MAC)和时间限定的单调递增序列仍然是一个完全有效的UUID,但如果您可以从令牌序列反向工程单个UUID,那么它是高度可预测的

  • 加密安全PRNG的定义特征是,给定迭代的结果不包含足够的信息来推断下一次迭代的值-即,生成器中存在一些隐藏状态,该状态未在数字中显示,并且无法通过检查PRNG中的数字序列来推断

    如果你学习了数论,你可以通过一系列生成的值来猜测某些PRNG的内部状态。是这种发电机的一个例子。它有一个隐藏的状态,它用来获得它的长周期,但它不是加密安全的-你可以采取一个相当小的数字序列,并使用它来推断内部状态。一旦你做到了这一点,你可以用它来攻击一个加密机制,该机制依赖于将该序列保密

  • UUID已经是唯一的了,所以不管怎样,MD5没有任何意义

    关于安全问题,一般来说,如果攻击者能够预测您将要生成的下一个唯一ID,则您可能会受到攻击。如果知道您是从UUID生成唯一ID的,那么潜在的下一个唯一ID集就会小得多,从而有更好的机会进行暴力攻击


    如果攻击者可以从您那里获得一大堆唯一的ID,并且这样可以猜测您生成UUID的方案,那么这一点尤其正确。

    的UUID已经MD5了,因此再次这样做没有意义。但是,我不确定UUID版本PHP使用的是什么。

    请注意,
    uniqid()
    不会返回一个
    ,而是一个基于当前时间的“唯一”字符串:

    $ php -r 'echo uniqid("prefix_", true);'
    prefix_4a8aaada61b0f0.86531181
    
    如果您多次这样做,您将得到非常相似的输出字符串,熟悉
    uniqid()
    的每个人都会识别源算法。这样就很容易预测将生成的下一个ID

    md5()-ing输出以及特定于应用程序的salt字符串或随机数的优点是更难猜测字符串:

    $ php -r 'echo md5(uniqid("prefix_", true));'
    3dbb5221b203888fc0f41f5ef960f51b
    
    与普通的
    uniqid()
    不同,它每微秒产生非常不同的输出。此外,它不会显示您的“前缀salt”字符串,也不会显示您正在引擎盖下使用
    uniqid()
    。在不知道盐的情况下,很难(认为不可能)猜出下一个ID


    总之,我不同意评论者的观点,我总是更喜欢
    md5()
    -ed输出,而不是普通的
    uniqid()

    作为旁白,从2010年起,md5实际上已经过时了,并且不会用于任何值得保护的东西——PHI、PII或PCI。美国联邦调查局已经强制执行,任何不遵守规定的实体都将支付大量的$$$罚款。

    是的。使用MD5进行安全保护的软件在2010年后将不会被正式考虑,但实际上,现在没有人想要它,因为他们将被要求在以后销毁它(很快以后就会有价值)。因此,如果您正在销售软件或软件即服务,那么您将排除一些仅通过使用MD5的客户。使用SHAx,最好使用较大的x值。据我所知,MD5从未包含在NIST标准中。NIST正在逐步淘汰的是SHA-1,基本上是所有具有80位或更低安全性的设备。此外,未执行NIST标准的公司不会被罚款。他们无法获得NIST认证,因此失去了需要此类认证的客户。如果您需要您的ID不可用,那么采用容易猜测的输入并混淆它不是一种方法。如果您不公开salt字符串(用于uniqid()的前缀),如何猜测输入?你能解释一下你的批评吗?有非常好的方法来生成真正不可用的ID。仅仅通过混淆一个容易预测的序列,你就依赖于没有人知道方法和你的盐串。如果他们这样做了,他们就可以很容易地预测你将来生成的ID。同样的道理,你也可以说每个基于密码短语的加密算法都很弱,因为你依赖于没有人知道密码。然而,这个问题是关于将MD5与PHP的uniqid()函数一起使用,不是吗