2016-09-12 2 views
1

CentOS6.6, 후위는 비둘기장 2.0.9와 MySQL 5.1.73SASL : UGFzc3dvcmQ6

비둘기장 구성 (/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 데이터베이스 :

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 코드 :

에 의해 생성됩니다.

850,363,210은 이제 인증을 일부 자바 코드를 작성 :

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은 "전통적인"16 진수 인코딩 (예 : SHA512.HEX)과 Base64 인코딩 (즉, SHA512.b64)의 두 가지 해시 인코딩을 알고 있습니다. 후자는 Dovecot에서 문자열 및 기본값으로 저장할 때보다 공간 효율적입니다. sha512, sha512.b64sha512.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 당신은 자바 진수로 인코딩 된 암호 해시를 생성합니다. 더 나은 해결책은 default_pass_scheme을 설정하는 대신 Dovecot의 {SCHEME}hash 인코딩을 사용하는 것입니다. 그렇게하면 모든 사용자의 비밀번호를 즉시 무효화하지 않고 나중에 쉽게 해시 방법을 변경/업그레이드 할 수 있습니다. 이 계획에 사용 된 해시의 예 :

{SHA512.hex}0da3b4b0385c432a800ca15eae1a8485e5f7abad7b70b4e1c2b9cf15f68afd256cedb2029c6f7cec09e1221e6b10142081e1bb8e5c 

마지막 : 큰 SHA512 해시를 사용하는 경우 암호의 일반 해싱 또한, 결코 저장되지 않습니다. 무염의 암호 해시를 저장하지 마십시오. 데이터베이스가 누출되면 무지개 테이블 공격에 취약합니다.

+0

내가이 작업을 수행하고 응답이 문제가 해결되면 지금 –

+0

작업이, 왼쪽에 체크 표시를 선택하는 것이 좋습니다. 또한 [FAQ]를보십시오. –

+0

안녕 Jens Erat, java로 sha512를 생성하는 방법 ?? –

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); 
    }