Security:cipher加密结果取决于服务器吗?

发布于 2024-10-16 22:49:39 字数 361 浏览 3 评论 0原文

我正在一个 cakephp 应用程序中工作,我使用 Security::cipher 来加密一些数据。它工作正常,但我已将文件和数据库移动到另一台服务器,现在加密结果不同。 我尝试过一些简单的行:

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

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

谢谢。

I'm working in a cakephp application where I use Security::cipher in order to encrypt some data. It works perfectly but I've moved files and DB to another server and now the encrypted result is different.
I've tried with some simple lines:

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

When I print $code, the value is different in both servers. I've configured the same Security.cipherSeed in both core.php files.
Is Security::cipher function using some server value to encrypt?

Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

别挽留 2024-10-23 22:49:39

好吧,看看这个错误,它确实存在似乎是一个问题。

深入研究源代码,这一行就是它的工作原理:

srand(Configure::read('Security.cipherSeed'));

现在,为什么这样有效?因为rand()实现了伪随机算法。因此,对于任何给定的已知种子,理论上您可以产生相同系列的随机输出。要看看这是否有效,让我们看看 rand() 的 PHP 源代码,特别是内部 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

编辑:我已经提交了关于这个主题的错误报告很精彩。

Well, looking at this bug, it does appear to be an issue.

Digging into the source code, this line is what makes it work:

srand(Configure::read('Security.cipherSeed'));

Now, why does that work? Because rand() implements a pseudo-random algorithm. So for any given known seed, you can theoretically produce the same series of random output. To see if this will work, let's look at the PHP source code for rand(), specifically the internal php_rand function:

PHPAPI long php_rand(TSRMLS_D)
{
    long ret;

    if (!BG(rand_is_seeded)) {
            php_srand(GENERATE_SEED() TSRMLS_CC);
    }

We know this isn't the problem, since we're manually seeding (unless we have the suhosin patch installed on the server, then it will always reseed and hence not work).

#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

Woah, did you see what happened? Depending on the server specification, is can use one of 4 different random libraries (rand(), random(), lrand48() or it's own internal random function php_rand_r)! That's why it's not portable across server installs.

Instead, use a real encryption library such as MCrypt or GPG.

Edit: I've submitted a bug report on this topic to cake.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文