Zend framework 使用带有MD5哈希值的Zend_Mail_Transport_Smtp作为密码

Zend framework 使用带有MD5哈希值的Zend_Mail_Transport_Smtp作为密码,zend-framework,zend-mail,webmail,smtp-auth,Zend Framework,Zend Mail,Webmail,Smtp Auth,我想为我的web应用程序的用户提供使用smtp服务器发送电子邮件的可能性 用户帐户的密码是md5 hased,smtp服务器正在散列收到的值,以检查正确的用户名密码组合 现在我正在寻找一种设置Zend_Mail_Transport_Smtp的好方法-我显然需要纯文本密码并将其转发到Smtp服务器,然后由Smtp服务器将其转换为md5哈希。 但这意味着我必须以明文形式将用户密码存储在某个地方,这是我希望避免的 关于如何使用zend框架设置webmailer,有什么最佳实践吗 我唯一的想法是在会话中

我想为我的web应用程序的用户提供使用smtp服务器发送电子邮件的可能性

用户帐户的密码是md5 hased,smtp服务器正在散列收到的值,以检查正确的用户名密码组合

现在我正在寻找一种设置Zend_Mail_Transport_Smtp的好方法-我显然需要纯文本密码并将其转发到Smtp服务器,然后由Smtp服务器将其转换为md5哈希。 但这意味着我必须以明文形式将用户密码存储在某个地方,这是我希望避免的

关于如何使用zend框架设置webmailer,有什么最佳实践吗


我唯一的想法是在会话中保存未保存的密码(我的应用程序中的用户帐户与邮件服务器帐户链接),但必须有更好的方法来处理这种情况

您可以做的是将密码以编码格式存储在数据库中,并在需要时在应用程序中解码。不幸的是,它只是一个散列函数,您无法解码为普通密码。我知道实现这一目标的三种方法:

  • 替换字母:

    您可以使用以下内容替换普通密码中的字母:

    // store this in the database
    $pw_rot = str_rot13( "plain_password" );
    // use this in the application
    $pw_plain = str_rot13( "cynva_cnffjbeq" );
    
    我不建议使用或类似的东西,因为看到密码的人很容易猜到

  • 无键解码/编码:

    另一种方法是使用函数对密码进行解码/编码,该函数不需要以下密钥:

    比上面的要好一点,但我只会将其用于测试目的,因为它易于实现和使用

  • 使用密钥解码/编码:

    更好的方法是使用密钥和对称分组密码,如:

    通过这种方式,只有能够访问数据库和源代码的人才能解码密码。不利的一面是,您的应用程序更复杂,对性能影响不大。还可以使用其他对称分组密码


  • 最重要的是:永远不要存储普通密码。

    你的问题是否解决了??
    // store this in the database
    $pw_base64 = base64_encode( "plain_password" );
    // use this in the application
    $pw_plain = base64_encode( "cGxhaW5fcGFzc3dvcmQ=" );
    
    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" );
      }