2011-02-10 3 views
3

저는 일부 데이터를 암호화하기 위해 Security :: cipher를 사용하는 cakephp 응용 프로그램에서 작업하고 있습니다. 그것은 완벽하게 작동하지만 파일과 DB를 다른 서버로 이동 시켰으며 이제 암호화 된 결과가 다릅니다. 나는 몇 가지 간단한 선으로 시도했다 :보안 : 암호로 암호화 된 결과는 서버에 따라 다릅니 까?

$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()은 의사 랜덤 알고리즘을 구현하기 때문에. 따라서 시드가 알려진 시드의 경우 이론적으로 동일한 일련의 무작위 출력을 생성 할 수 있습니다. 우리가 직접 우리가하지 않는 한 수호신 패치가 설치 (파종하고 있기 때문에 우리는이 방법으로 문제가 아니라는 것을 알고

PHPAPI long php_rand(TSRMLS_D) 
{ 
    long ret; 

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

이 작동되는지 확인하기 위해,이 the PHP source code for rand() 보면 특히 내부 php_rand 기능 보자 서버가 있으면 항상 다시 시드되어 작동하지 않습니다).

#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을 제출했습니다.

+0

감사합니다. ircmaxell. 암호 함수를 살펴 봤지만 어떻게 작동하는지 전혀 몰랐습니다. 나는 이러한 encription 라이브러리를 사용해 보겠습니다. – Min

+0

나는 이것도 가지고 있었고, 서버를 바꿀 때 로그인하거나 쿠키를 사용할 수 없었다! – Dunhamzzz

관련 문제