2016-09-12 11 views
1

CentOS6.6, Postfix, Dovecot 2.0.9 и MySQL 5.1.73SASL аутентификации не удалось ВХОД: UGFzc3dvcmQ6

конфигурации Dovecot (/etc/dovecot/dovecot-sql.conf.ext):

driver = mysql  
connect = host=127.0.0.1 dbname=postfix user=root password=lingo 

default_pass_scheme = SHA512 
password_query = SELECT email as user, password FROM virtual_user WHERE email='%u'; 

баз данных:

mysql> SELECT email as user, password FROM virtual_user WHERE email='[email protected]'; 
+--------------------------+------------------------------------------------------------------------------------------------------------+ 
| user      | password                         | 
+--------------------------+------------------------------------------------------------------------------------------------------------+ 
| [email protected] | 0da3b4b0385c432a800ca15eae1a8485e5f7abad7b70b4e1c2b9cf15f68afd256cedb2029c6f7cec09e1221e6b10142081e1bb8e5c | 
+--------------------------+------------------------------------------------------------------------------------------------------------+ 
1 row in set (0.00 sec) 

Пароль генерируется commons-codec, код Java:

System.out.println(DigestUtils.sha512Hex("lingo".getBytes())); 
//print :0da3b4b0385c432a800ca15eae1a8485e5f7abad7b70b4e1c2b9cf15f68afd256cedb2029c6f7cec09e1221e6b10142081e1bb8e5c 

Теперь я написал несколько Java-код для проверки подлинности:

public static void sendEmail() throws EmailException, GeneralSecurityException { 

     SimpleEmail email = new SimpleEmail(); 
     // smtp host 
     email.setHostName("192.168.15.139"); 
     email.setSmtpPort(25); 
     email.setDebug(true); 
     // DigestUtils.sha512Hex("lingo".getBytes()) 
     email.setAuthentication("[email protected]", "lingo"); 

     email.setStartTLSEnabled(true); 
     MailSSLSocketFactory socketFactory = new MailSSLSocketFactory(); 
     socketFactory.setTrustAllHosts(true); 
     Properties propsSSL = email.getMailSession().getProperties(); 
     propsSSL.put("mail.smtp.port", "465"); 
     propsSSL.put("mail.smtp.ssl.checkserveridentity", "false"); 
     propsSSL.put("mail.smtp.ssl.socketFactory", socketFactory); 
     email.addTo("[email protected]", "John Doe"); 
     email.setFrom("[email protected]", "Me"); 
     email.setSubject("Test message"); 
     email.setMsg("This is a simple test of commons-email"); 
     email.send(); 
     System.out.println("success"); 
    } 

    public static void main(String[] args) throws Exception { 
     SendEmailTest.sendEmail(); 
     // System.out.println(DigestUtils.sha512Hex("lingo".getBytes())); 
    } 

Но он терпит неудачу с ошибкой при слежении:

Sep 12 13:30:51 localhost dovecot: auth: Debug: sql([email protected],192.168.15.243): query: SELECT email as user, password FROM virtual_user WHERE email='[email protected]'; 
Sep 12 13:30:51 localhost dovecot: auth: Error: sql([email protected],192.168.15.243): Password in passdb is not in expected scheme SHA512 
Sep 12 13:30:53 localhost postfix/smtpd[1872]: warning: unknown[192.168.15.243]: SASL LOGIN authentication failed: UGFzc3dvcmQ6 
Sep 12 13:30:53 localhost dovecot: auth: Debug: client out: FAIL#0115#[email protected] 
Sep 12 13:30:53 localhost postfix/smtpd[1872]: lost connection after AUTH from unknown[192.168.15.243] 
Sep 12 13:30:53 localhost postfix/smtpd[1872]: disconnect from unknown[192.168.15.243] 

Как я могу исправить аутентификацию?

ответ

1

Это проблема конфигурации dovecot. Dovecot знает два хэш-кодирования, «традиционное» шестнадцатеричное кодирование (то есть SHA512.HEX) и Base64-кодирование (то есть SHA512.b64). Последний более экономичен в пространстве при сохранении в качестве строк и значения по умолчанию в Dovecot. В качестве примера для создания хэш с sha512, sha512.b64 и sha512.hex кодировок:

$ doveadm pw -p lingo -s sha512 
{SHA512}DaO0sDhcQyqADKFerhqEheX3q617cLThwrnPFfaK/SVs7bICnG987AnhIh5rEBQggeG7jlyAL7l+g8iTwo2GFA== 
$ doveadm pw -p lingo -s sha512.b64 
{SHA512.b64}DaO0sDhcQyqADKFerhqEheX3q617cLThwrnPFfaK/SVs7bICnG987AnhIh5rEBQggeG7jlyAL7l+g8iTwo2GFA== 
$ doveadm pw -p lingo -s sha512.hex 
{SHA512.HEX}0da3b4b0385c432a800ca15eae1a8485e5f7abad7b70b4e1c2b9cf15f68afd256cedb2029c6f7cec09e1221e6b10142081e1bb8e5c802fb97e83c893c28d8614 

Используйте default_pass_scheme = SHA512.HEX, если вы создаете шестигранные закодированные пароли хэшей в Java. Лучшим решением было бы использовать кодировку Dovecot {SCHEME}hash вместо установки default_pass_scheme, хотя: при этом вы можете легко изменить/обновить хеш-метод позже, не нарушая одновременно все пароли пользователей. Пример хэша, который вы использовали в этой схеме:

{SHA512.hex}0da3b4b0385c432a800ca15eae1a8485e5f7abad7b70b4e1c2b9cf15f68afd256cedb2029c6f7cec09e1221e6b10142081e1bb8e5c 

Наконец: простая хеширование паролей никогда сохранить, также не при использовании больших SHA512 хэш. Никогда не храните несоленые хэши паролей, вы уязвимы для атаки радужных таблиц, если база данных течет.

+0

я это сделать и сейчас работать –

+0

Если ответ решить проблему, рассмотреть вопрос о выборе галочки слева. Также просмотрите [FAQ]. –

+0

привет Йенс Эрат, как сгенерировать sha512 по java ?? –

0

я генерировать этот код:

private String SHA(final String strText, final String strType) { 
     String strResult = null; 
     if (strText != null && strText.length() > 0) { 
      try { 
       MessageDigest messageDigest = MessageDigest.getInstance(strType); 
       messageDigest.update(strText.getBytes()); 
       byte byteBuffer[] = messageDigest.digest(); 
       StringBuffer strHexString = new StringBuffer(); 
       for (int i = 0; i < byteBuffer.length; i++) { 
        String hex = Integer.toHexString(0xff & byteBuffer[i]); 
        if (hex.length() == 1) { 
         strHexString.append('0'); 
        } 
        strHexString.append(hex); 
       } 
       strResult = strHexString.toString(); 
      } catch (NoSuchAlgorithmException e) { 
       e.printStackTrace(); 
      } 
     } 

     return strResult; 
    } 

    public static void main(String[] args) { 
     EncryptUtils et=new EncryptUtils(); 
     String pas=et.SHA512("lingo"); 
     System.out.println("{SHA512.HEX}"+pas); 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^