我已经用Java编写了一个发送电子邮件的应用程序.为了发送电子邮件,我使用了带TLS的SMTP.
最近,我搜索了TLS,并在this website上找到了有关TLS的流动描述:传输层安全性(TLS),该协议可以安全地加密和传送邮件,有助于防止邮件服务器之间的窃听和欺骗(邮件伪造).
上面的短语说TLS保证邮件将被安全地发送,但是它并没有说明密码.
假设我在应用程序中使用了以下代码,因此您可以看到您需要使用用户名和密码的硬代码,而无需进行任何加密.
final String username = "...@hotmail.com";
final String password = "your Password";
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "smtp-mail.outlook.com");
props.put("mail.smtp.port", "587");
Session session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
通过使用此策略,TLS在从我的服务器发送到另一台服务器时是否会加密我的密码?我应该担心吗?
解决方法:
密码传输和通信加密是两个独立的问题.
通过发出STARTTLS命令,首先通过未加密的通道启动TLS.如果服务器支持,则交换完成,完成后,通道将被加密.
然后,SMTP协商才开始.谈判的一部分是身份验证(如果有).而且,即使您使用普通的身份验证机制(用户和密码都是通过有线方式发送的),由于该通道当时是加密的,所以窃听者不会清楚地看到它.
当然,为了提高安全性,您可以选择使用其他认证机制,而不是普通认证机制(例如CRAM-MD5;存在其他认证机制).
编辑好,上面的答案只是部分准确;可以在this excellent answer on ServerFault by @Bruno中找到更多详细信息