那么,看着this bug,它确实似乎是一个问题。
挖掘到the source code,这条线是什么使得它的工作:
srand(Configure::read('Security.cipherSeed'));
现在,为什么这项工作?因为rand()
实现了一个伪随机算法。因此,对于任何给定的已知的种子,可以理论上产生相同的一系列随机输出。要查看是否这会工作,让我们来看看the PHP source code for rand()
,特别是内部php_rand
功能:
PHPAPI long php_rand(TSRMLS_D)
{
long ret;
if (!BG(rand_is_seeded)) {
php_srand(GENERATE_SEED() TSRMLS_CC);
}
我们知道这是没有问题的,因为我们手动播种(除非我们对安装了Suhosin补丁服务器,那么它将永远是种子,因此不工作)。
#ifdef ZTS
ret = php_rand_r(&BG(rand_seed));
#else
# if defined(HAVE_RANDOM)
ret = random();
# elif defined(HAVE_LRAND48)
ret = lrand48();
# else
ret = rand();
# endif
#endif
哇,你看见发生了什么?根据服务器规格,可以使用4个不同的随机函数库中的一个(rand()
,random()
,lrand48()
或它自己的内部随机函数php_rand_r
)!这就是为什么它不能通过服务器安装进行移植。
而是使用真实的加密库,如MCrypt或GPG。
编辑:我已经提交了关于此主题的bug report来蛋糕。
谢谢ircmaxell。我看了一下密码功能,但我不知道它是如何工作的。 我会尝试那些encription库。 – Min 2011-02-10 16:46:18