PHP 有一个uniqid() https://www.php.net/manual/en/function.uniqid.php生成某种 UUID 的函数。
在使用示例中,它显示了以下内容:
$token = md5(uniqid());
但在评论中,有人这么说 https://www.php.net/manual/en/function.uniqid.php#91126:
从唯一 ID 生成 MD5 是
幼稚并降低了很多价值
唯一的ID,以及提供
显着的(可攻击的)限制
MD5 域。那是一个深深的
破碎的事情要做。正确的
方法是使用唯一 ID
它自己的;它已经准备好了
不碰撞。
如果是的话,为什么这是真的?如果 MD5 哈希对于唯一 ID 而言(几乎)是唯一的,那么对 uniqid 进行 md5 处理有什么问题呢?
UUID 为 128 位宽,并且其生成方式具有固有的唯一性。 MD5 哈希值的宽度为 128 位,不保证唯一性,仅保证较低的冲突概率。 MD5 哈希不小于 UUID,因此它对存储没有帮助。
如果您知道哈希值来自 UUID,则攻击会更容易,因为如果您了解有关生成 UUID 的机器的任何信息,则有效 UUID 的域实际上是相当可预测的。
如果您需要提供安全令牌,那么您需要使用加密安全的随机数生成器。 http://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator(1) UUID 并非旨在加密安全,仅保证唯一。由唯一机器标识符(通常是 MAC)和时间限制的单调递增序列仍然是一个完全有效的 UUID,但如果您可以从令牌序列对单个 UUID 进行逆向工程,那么它是高度可预测的。
- 加密安全 PRNG 的定义特征是给定迭代的结果不包含足够的信息来推断下一次迭代的值 - 即生成器中存在一些未在数字中显示且无法推断的隐藏状态通过检查 PRNG 中的数字序列。
如果您了解数论,您可以找到从生成值序列猜测某些 PRNG 内部状态的方法。梅森扭转者 http://en.wikipedia.org/wiki/Mersenne_twister是此类生成器的一个示例。它具有隐藏状态,它曾经获得很长的周期,但它在加密上并不安全 - 您可以采用相当小的数字序列并使用它来推断内部状态。完成此操作后,您可以使用它来攻击依赖于对该序列保密的加密机制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)