安全性:密码加密结果取决于服务器吗?

时间:2011-02-10 12:31:58

标签: php security cakephp encryption platform-independent

我在Cakephp应用程序中工作,我使用Security :: cipher来加密某些数据。它工作得很好,但我已经将文件和数据库移动到另一台服务器,现在加密的结果是不同的。 我尝试过一些简单的界限:

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

当我打印$ code时,两个服务器的值都不同。我在两个core.php文件中配置了相同的Security.cipherSeed。 Security :: cipher函数是否使用某个服务器值进行加密?

谢谢。

1 个答案:

答案 0 :(得分: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来制作蛋糕。