使用TLS连接通过SMTP发送电子邮件加密用户名和密码?

时间:2015-06-25 08:04:50

标签: java security ssl encryption smtp

我已经用Java编写了一个发送电子邮件的appilicaiton。要发送电子邮件,我已将SMTPTLS一起使用。

最近我搜索了TLS,我在this website找到了关于TLS的流畅描述:Transport Layer Security (TLS), a protocol that encrypts and delivers mail securely, helps prevent eavesdropping and spoofing (message forgery) between mail servers.

上述短语表示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在从我的服务器发送到另一台服务器时是否加密了我的密码?我应该担心吗?

1 个答案:

答案 0 :(得分:4)

密码传输和通信加密是两个独立的事项。

通过发出STARTTLS命令,首先在未加密的通道上启动TLS;如果服务器支持它,那么交换就完成了,完成后,通道就会被加密。

然后才开始SMTP协商;如果有的话,这个协会的一部分就是认证。即使您使用普通的身份验证机制(通过线路发送的用户和密码),由于此时通道已加密,因此窃听者无法清楚地看到它。

当然,为了更高的安全性,您可以选择使用另一种身份验证机制而不是普通的(例如CRAM-MD5;其他存在)。

编辑好的,上面的答案只是部分准确;更多详情可在this excellent answer on ServerFault by @Bruno

中找到