2011-03-20 3 views
2

Mac OSX에서 Mamp 서버를 사용하고 있습니다. 클라이언트 측 쿠키에 대한 프로젝트에서 암호화를 구현하려고합니다. 나는 경고 얻고mcrypt_module_open() 경고!

경고 : mcrypt_module_open() 모듈 오픈 function.mcrypt] : 수 열려 있지 암호화 모듈

내가 php.ini 파일에서 확인하고 세미콜론에서이없는 mcrypt 확장의 앞. 누군가가이 문제를 도울 수 있습니까? 사전

답변

5

Mcrypt 라이브러리 모듈은 php.ini 파일에 설정되어있는

덕분에, 그렇지 않으면 당신은 선 Call to undefined function 함께 오류 메시지가 표시됩니다.

요청 된 암호 방법을 사용할 수 없다는 의미입니다. 오타가 있거나 암호 중 하나가 mcrypt.so 버전으로 컴파일되지 않았습니다.

mcrypt_module_open('rijndael-256', '', 'ofb', ''); // works 

mcrypt_module_open('wrong', '', '', ''); // generates your error 
manual page

과 추가 매개 변수는 시스템의 libmcrypt 공유 모듈 자체에 의존 수 있음을 나타냅니다. 따라서 다른 버전을 검색하고 싶을 수도 있습니다. MAMP 업데이트를 사용해 보거나 PHP 배포판에 존재하는 pro 버전을 사용하십시오.

+0

문제를 해결하는 데 도움을 주시겠습니까? 나는 그 경고를 없애고 그것을 작동시키는 단서가 없다. – user525146

+1

관련 코드 부분을 표시하지 않으면 모든 사람이 추측 할 수 있습니다. – mario

0

CFB 모드에서 복어 알고리즘을 사용하고 있습니다.

static $cipher = 'blowfish';  
static $mode = 'cfb'; 
static $key = '$pxaWyXY67UIq*i&mNlFswBzyJkL7#1N'; 

내가 알고리즘을 호출에 사용되는 명령은

mcrypt_module_open($cipher, '', $mode, ''); 

내가 다른 알고리즘을 시도하고 그 중 하나가 작동하는지 확인 것입니다.

+0

나는 rijndael-256을 사용해 보았습니다. 이것조차도 작동하지 않았습니다. 프로 Mamp에 오면, 나는 사기에 자유로운 판을 선호 할텐데. – user525146

+0

phpinfo 페이지를 확인했는데 페이지에 mcrypt가 활성화되어있는 것으로 나타났습니다. 나는 구글에서 어떤 해결책도 보지 못한다. – user525146

0

@mario : 답장을 보내 주셔서 감사합니다. 이것은 암호화를위한 코드입니다.

class Cookie { 
    private $created; 
    private $userid; 
    private $version; 
    // mcrypt handle 
    private $td; 

    // mcrypt information 
    static $cipher = 'rijndael-256'; 
    static $mode = 'ofb'; 
    static $key = '$pxaWyXY67UIq*i&mNlFswBzyJkL7#1N'; 

    // Cookie format information 
    static $cookiename = 'USERAUTH'; 
    static $myversion = '1'; 
    // When the cookie expires 
    static $expiration = '600'; 
    // When to reissue the cookie 
    static $warning = '300'; 
    static $glue = '|'; 

    public function __construct($userid = false) { 
     $this->td = mcrypt_module_open($cipher, '', $mode, ''); 
     if($this->userid) { 
      $this->userid = $userid; 
     } else { 
      if(array_key_exists(self::$cookiename, $_COOKIE)) { 
       $buffer = $this->_unpackage($_COOKIE[self::$cookiename]); 
      } else { 
       throw new AuthException("No Cookie"); 
      } 
     } 
    } 

public function _encrypt($plaintext) { 
     //$td = mcrypt_module_open (self::$cipher, '', self::$mode, ''); 
     $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size ($td), MYCRYPT_RAND); 
     mcrypt_generic_init ($td, $plaintext); 
     $crypttext = mcrypt_generic($td, $plaintext); 
     mcrypt_generic_deinit ($td); 
     return $iv.$crypttext; 
    } 

    public function _decrypt($crypttext) { 
     //$td = mcrypt_module_open (self::$cipher, '', self::$mode, ''); 
     $ivsize = mcrypt_enc_get_iv_size ($td); 
     $iv = substr ($crypt, 0, $ivsize); 
     $crypttext = substr ($crypttext, $ivsize); 
     $plaintext = ""; 
     if($iv) { 
      mcrypt_generic_init($td, self::$key, $iv); 
      $plaintext = mdecrypt_generic($td, $crypttext); 
      mcrypt_generic_deinit ($td);  
     } 
     return $plaintext; 
    } 
2

또한 조지 Schlassnagles "고급 PHP 프로그래밍"(페이지 334ff)에서이 샘플을 사용하고 있습니다. 이 코드에는 몇 가지 실수가 포함되어 있습니다. 정적 변수를 참조 할 때 self :: $ var로 호출해야한다고 생각합니다.

이 하나의 작업을해야합니다 :

mcrypt_module_open(self::$cipher, '', self::$mode, ''); 

주와 같은 좀 더 실수가 있음 :

  • 자기 :: $의 resettime 분명 자기 이름을 지정해야합니다 유효성 검사() 함수에 :: $ 경고.함수 _encrypt() 및 _decrypt()에
  • 정적 $ 키) (자기 : $ 키
  • $ 접착제 _package (단위)과 _unpackage 함수이어야 자기 : $ 접착제
  • 함수 _reissue되어야 의 setcookie 이름과 경로 '/'(넷째 파라미터)을 구비한다 $ this-> TD
  • set_cookie 설정 기능에() 및 로그 아웃()이어야 함수 _encrypt()에
  • $ TD를 사용하지 않는다 전체 웹 사이트에서 쿠키를 사용하십시오 (그렇지 않으면/login/facebook에서 쿠키를 설정하는 경우/대시 보드에서 액세스 할 수 없음)
  • $ ivsize = mcrypt_get_iv_s ize ($ this-> td); 당신의 libmcrypt는 "--disable-동적 로딩"플래그로 구성된 경우 _decrypt에() $ivsize = mcrypt_get_iv_size(self::$cypher, self::$mode);
0

을해야한다,이 문제는 Mcrypt 라이브러리에 사용 가능한 알고리즘이 없을 것으로 발생합니다.

해당 플래그없이 libmcrypt를 다시 컴파일하면 작동합니다. PHP 나 ext/mcrypt 모듈을 다시 빌드 할 필요조차 없습니다.

정확한 문제가 있습니다. (PHP 5.5 Solaris10/Sparc)