2013-06-28 39 views
2

http://php.net/manual/en/function.mt-rand.php为什么PHP的mt_rand不是密码保密的?

注意此功能不会产生加密安全值,而不应被用于密码的目的。

有人可以请解释这是什么意思在网站上下文?这是否意味着它不应该被用来生成安全令牌?

在32位系统PHP_INT_SIZE是刚刚超过2十亿。如果我生成一个数字mt_rand(0, PHP_INT_SIZE)并添加一个长度为100个字符的随机字符串并将其用作安全令牌,是否表示它不安全?

回答

2

如果通过“安全令牌”,你的意思是一个nonce,即一个使用的令牌应该是唯一的,几乎肯定,然后mt_rand就好了。

“不加密生成安全值”,在这种情况下意味着,给定的发电机someone can predict what its output will be in the future的状态的足够信息。显然,如果您要使用所述输出来加密敏感信息,那么这是一种破坏行为。

+0

谢谢。你可以给一个网站的应用程序的例子,有人有“有关发电机的状态足够的信息”,并使用它不利?我读了你的第二个链接,但我仍然不确定。 – texelate

+0

@texelate:很难给出一个实际的例子,因为典型的web应用程序不会将加密数据发送给没有加密密钥的人。但是你可以从[this]得到一些想法(http://crypto.stackexchange.com/questions/2231/cryptographic-security-of-php-mt-rand-function-using-mersenne-twister-algo)。 – Jon

+1

@texelate:随机示例。您存储加密的用户文本(如上所述的加密方法),其中用MT生成了密钥,但只有所有者保留该密钥。有人注册并实现(或猜测或知道)他们的密钥是由MT生成的。然后他们进入你的数据库(也许是一个简单的SQL注入)并获得加密文本。如果一段文本足够大并且只包含ASCII字符(合理的英文假设),他们可以在不知道密钥的情况下解密该文本。 – Jon

1

这是因为它不是真正的随机。 Mersenne Twister基于线性递归,所以任何由线性递归产生的伪随机数序列都是不安全的,因为从输出的足够长的子序列可以预测进一步的结果。

相关问题