【问题标题】:How to use DIGEST-MD5 with Javamail如何在 Javamail 中使用 DIGEST-MD5
【发布时间】:2014-06-22 14:05:00
【问题描述】:

我的应用程序使用 Javamail 发送电子邮件。为了通过电子邮件服务器进行身份验证,我目前必须将密码存储在应用程序配置文件中的某个位置。我想避免这种情况,通过只存储密码的哈希值来提供至少一点安全性。

根据维基百科文章http://en.wikipedia.org/wiki/Digest_access_authentication,我应该能够通过使用 DIGEST-MD5 身份验证来实现这一点,它允许应用程序仅使用用户名的 MD5 散列进行身份验证:领域:密码而不需要知道明文密码。

我找不到任何关于如何在 Javamail 中使用 DIGEST-MD5 的明确示例。我看到一些对 com.sun.mail.smtp.DigestMD5 类的引用,但这在最新的 javamail 包中不存在,我找不到任何解释。

下面的代码是我所能得到的。电子邮件已成功发送,但调试输出似乎表明它仍在通过 SASL 使用 PLAIN 身份验证,即使我已指定 DIGEST-MD5 是唯一允许的机制。

除此之外,我仍然将明文密码指定为 transport.connect 方法的参数,而我想提供散列后的 username:realm:password。

谁能给我指出一个使用 DIGEST-MD5 和 Javamail 的工作示例?谢谢!

下面的代码,删除了 try/catch 块...

Properties properties=new Properties();
properties.put("mail.smtp.starttls.enable","true");
properties.put("mail.smtp.timeout",3000); // 3 second timeout establishing connection
properties.put("mail.smtp.auth.mechanisms","DIGEST-MD5");
Session session=Session.getInstance(properties);
session.setDebug(true);
Message message=new MimeMessage(session);
message.setFrom(constructAddress(myGmailAddress,"my name"));
message.addRecipient(Message.RecipientType.TO,constructAddress(recipientEmailAddress,"Recipient Name"));
message.setSubject("test email");
message.setText("...");
SMTPTransport transport=(SMTPTransport)session.getTransport("smtp");
transport.setSASLEnabled(true);
transport.setSASLRealm("gmail.com");
transport.connect("smtp.gmail.com",587,myGmailAddress,password);
transport.sendMessage(message,message.getAllRecipients());
transport.close();

这是(截断的)调试输出:

DEBUG: setDebug: JavaMail version 1.5.1
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 587, isSSL false
220 mx.google.com ESMTP pb7sm87689296pac.10 - gsmtp
DEBUG SMTP: connected to host "smtp.gmail.com", port: 587

EHLO laptop-mj
250-mx.google.com at your service, [(my ip address)]
250-SIZE 35882577
250-8BITMIME
250-STARTTLS
250-ENHANCEDSTATUSCODES
250 CHUNKING
DEBUG SMTP: Found extension "SIZE", arg "35882577"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "CHUNKING", arg ""
STARTTLS
220 2.0.0 Ready to start TLS
EHLO laptop-mj
250-mx.google.com at your service, [(my ip address)]
250-SIZE 35882577
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH XOAUTH2 PLAIN-CLIENTTOKEN
250-ENHANCEDSTATUSCODES
250 CHUNKING
DEBUG SMTP: Found extension "SIZE", arg "35882577"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH XOAUTH2 PLAIN-CLIENTTOKEN"
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "CHUNKING", arg ""
DEBUG SMTP: Authenticate with SASL
DEBUG SMTP: SASL AUTH command trace suppressed
DEBUG SMTP: SASL Mechanisms:
DEBUG SMTP:  LOGIN
DEBUG SMTP:  PLAIN
DEBUG SMTP:  XOAUTH
DEBUG SMTP:  XOAUTH2
DEBUG SMTP:  PLAIN-CLIENTTOKEN
DEBUG SMTP: 
DEBUG SMTP: SASL callback length: 2
DEBUG SMTP: SASL callback 0: javax.security.auth.callback.NameCallback@55f6efd2
DEBUG SMTP: SASL callback 1: javax.security.auth.callback.PasswordCallback@46faf015
DEBUG SMTP: SASL client PLAIN
DEBUG SMTP: use8bit false
MAIL FROM:<(my gmail address)>
250 2.1.0 OK pb7sm87689296pac.10 - gsmtp
... continues on with successful email transmission

【问题讨论】:

  • 我使用纯文本选项将我的电子邮件密码存储在 LDAP 服务器的一个受到严格保护的子树中,因此应用程序可以查找它们。这样它们就不是应用程序的一部分,我可以随时以管理方式更改它们。
  • 感谢您的建议,但此应用程序将安装在可能没有 LDAP 服务器的客户端站点上

标签: md5 jakarta-mail digest-authentication smtp-auth


【解决方案1】:

DIGEST-MD5 允许服务器 不存储密码,但客户端仍然需要密码。主要优点是密码永远不会以明文形式发送到服务器。

如果服务器支持 DIGEST-MD5(Gmail 似乎不支持),您可以像使用任何其他身份验证一样使用它,为连接方法提供密码。

【讨论】:

  • 感谢您回复比尔。我链接的维基百科文章是否引用了 DIGEST-MD5 以外的内容?它说密码只会与用户名和领域一起发送散列,这意味着客户端理论上也不需要知道明文密码。如果 Javamail API 仍然需要明文密码,这是 API 的限制,而不是 DIGEST-MD5 身份验证机制。
  • 据我了解,客户端需要纯文本密码才能计算对服务器质询的哈希响应。如果您可以存储一些不是密码的东西,并且您可以在需要进行身份验证时将其发送到服务器,那么其他东西难道不是有效地密码吗?
  • 是的,如果客户端存储了 MD5(username:realm:password),那么发现它的人可以使用它来访问邮件服务器帐户,假设他们识别出他们找到的内容并拥有了解 DIGEST-MD5 身份验证和一些编码技能。但是,出于多种原因,这仍然比存储明文密码要好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 2021-06-29
  • 1970-01-01
  • 2012-08-06
  • 2014-05-28
  • 2017-02-26
相关资源
最近更新 更多