2012-07-16 3 views
4

smtp-server를 사용하여 전자 메일을 보낼 수있는 사용자를 내 웹 응용 프로그램에 제공하고 싶습니다.Zend_Mail_Transport_Smtp와 MD5-Hashed 값을 비밀번호로 사용하십시오.

사용자 계정의 비밀번호는 md5-hased이며 smtp-server는 올바른 username-password kobination을 확인하기 위해받은 값을 해싱합니다.

이제는 Zend_Mail_Transport_Smtp를 설정하는 좋은 방법을 찾고 있습니다. 일반 텍스트 암호가 분명히 필요하며 smtp 서버로 전달하여 md5 해시로 변환합니다. 하지만 그건 내가 평소와 같이 사용자 암호를 어딘가에 저장해야한다는 것을 의미합니다. 나는 그것을 피하고 싶습니다.

젠드 프레임 워크를 사용하여 웹 메일러를 설정하는 방법에 대한 모범 사례가 있습니까?

내가 가진 유일한 아이디어는 세션 (내 응용 프로그램에서 사용자 계정이 메일 서버 계정과 연결되어 있습니다)에 해시되지 않은 암호를 저장했지만,이 상황을 처리하는 더 좋은 방법이 있어야한다

+0

문제가 해결 되었습니까? 아니요? – Jalpesh

+0

아니요, 그렇지 않습니다 ... – jantoenjes

답변

3

암호를 암호화 된 형식으로 데이터베이스에 저장하고 필요할 때 응용 프로그램에서 디코딩 할 수 있습니다. 불행히도 MD5은 해시 함수에 불과하므로 일반 암호로 디코딩 할 수 없습니다.

  1. 대체 문자 : 나는이 작업을 수행하는 세 가지 방법을 알고

    당신은 당신의 일반 암호 문자를 대체 할 ROT13 같은 것을 사용할 수 있습니다

    // store this in the database 
    $pw_rot = str_rot13("plain_password"); 
    // use this in the application 
    $pw_plain = str_rot13("cynva_cnffjbeq"); 
    

    내가 사용하는 것이 좋습니다 않을 것 암호를 보는 사람이 쉽게 추측 할 수 있기 때문에 str_rot13() 또는 이와 비슷한 내용이 포함되어 있습니다.

  2. 디코드/열쇠없이 인코딩 :

    또 다른 방법은/디코딩 Base64 같은 키가 필요하지 않는 기능으로 암호를 인코딩하는 것입니다

    :

    // store this in the database 
    $pw_base64 = base64_encode("plain_password"); 
    // use this in the application 
    $pw_plain = base64_encode("cGxhaW5fcGFzc3dvcmQ="); 
    

    조금 더 나은 위의 내용은 테스트 목적으로 만 사용합니다. 구현 및 사용하기 쉽기 때문입니다.

  3. 디코드/열쇠로 인코딩이 :

    더 좋은 방법 키를 사용하는 것입니다 및 Blowfish 같은 대칭 블록 암호 :이 방법으로

    class Password { 
        const KEY = 'your_secret_key_for_the_cipher'; 
    
        // encode the plain text with key for storing in the database 
        public function encode($plain_text) { 
        // set up the environment 
        $td  = mcrypt_module_open(MCRYPT_BLOWFISH, '', MCRYPT_MODE_ECB, ''); 
        $key  = substr(self::KEY, 0, mcrypt_enc_get_key_size($td)); 
        $iv_size = mcrypt_enc_get_iv_size($td); 
        $iv  = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
    
        if(mcrypt_generic_init($td, $key, $iv) != -1) { 
         $cipher_text = mcrypt_generic($td, $plain_text); 
         // clean up the mcrypt enviroment 
         mcrypt_generic_deinit($td); 
         mcrypt_module_close($td); 
        } 
    
        // use hex value    
        return bin2hex($cipher_text); 
        } 
    
        // decode the stored cipher text with key to use in the application 
        public function decode($cipher_text) { 
        // set up the environment 
        $td  = mcrypt_module_open(MCRYPT_BLOWFISH, '', MCRYPT_MODE_ECB, ''); 
        $key  = substr(self::KEY, 0, mcrypt_enc_get_key_size($td)); 
        $iv_size = mcrypt_enc_get_iv_size($td); 
        $iv  = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
    
        if(mcrypt_generic_init($td, $key, $iv) != -1) { 
         $plain_text = mdecrypt_generic($td, pack("H*" , $cipher_text)); 
         // clean up the mcrypt environment 
         mcrypt_generic_deinit($td); 
         mcrypt_module_close($td); 
        } 
    
        // remove NUL which maybe added by padding the plain_text 
        return rtrim($plain_text, "\0"); 
        } 
    

    데이터베이스에 대한 액세스 권한이있는 사람 만하고 소스 코드는 암호를 해독 할 수 있습니다. 아래쪽에는 더 복잡한 응용 프로그램과 약간의 성능 영향이 있습니다. 또한 다른 대칭 블록 암호도 가능합니다.

그리고 가장 중요한

: 일반 암호를 저장하지 마십시오.

관련 문제