2011-02-10 47 views
3

我正在cakephp应用程序中使用Security :: cipher来加密一些数据。它完美的工作,但我已经移动文件和数据库到另一台服务器,现在加密的结果是不同的。 我试着用一些简单的线条:安全性:密码加密结果取决于服务器吗?

$security = new Security; 
$code = $security->cipher('1234', Configure::read('Security.cipherSeed')); 

当我打印$代码,该值是在两台服务器上不同。我在两个core.php文件中都配置了相同的Security.cipherSeed。 Security :: cipher函数是否使用一些服务器值来加密?

谢谢。

回答

6

那么,看着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)!这就是为什么它不能通过服务器安装进行移植。

而是使用真实的加密库,如MCryptGPG

编辑:我已经提交了关于此主题的bug report来蛋糕。

+0

谢谢ircmaxell。我看了一下密码功能,但我不知道它是如何工作的。 我会尝试那些encription库。 – Min 2011-02-10 16:46:18