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

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

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

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

谢谢.

解决方法:

那么,看看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蛋糕.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...