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

Java 通过SMTP和TLS连接发送电子邮件是否加密用户名和密码?,java,security,ssl,encryption,smtp,Java,Security,Ssl,Encryption,Smtp,我已经用Java编写了一个发送电子邮件的应用程序。对于发送电子邮件,我使用了SMTP和TLS 最近我搜索了关于TLS的内容,并在上找到了关于TLS的流动描述:Transport Layer Security(TLS),一种安全加密和传递邮件的协议,有助于防止邮件服务器之间的窃听和欺骗(邮件伪造)。 上面这句话说,TLS保证邮件将被安全地传递,但它没有说任何关于密码的事情 假设我在我的应用程序中使用以下代码,您可以看到,您需要有用户名和密码的硬代码,而不需要任何加密 final Strin

我已经用Java编写了一个发送电子邮件的应用程序。对于发送电子邮件,我使用了
SMTP
TLS

最近我搜索了关于TLS的内容,并在上找到了关于TLS的流动描述:
Transport Layer Security(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是否在从我的服务器发送到另一台服务器时加密我的密码?我该不该担心呢?

密码传输和通信加密是两个独立的问题

TLS通过发出STARTTLS命令在最初未加密的通道上启动;如果服务器支持,则交换完成,交换完成后,通道将加密

只有到那时,SMTP协商才开始;谈判的一部分是认证,如果有的话。即使使用普通身份验证机制(用户和密码按原样通过线路发送),由于当时通道是加密的,窃听者也不会清楚地看到它

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



编辑好,以上答案仅部分准确;更多详细信息可在

中找到,因此,如果我理解正确,TLS会建立一个安全加密的通信通道,然后SMTP会通过该通道尝试验证我的用户和密码。我说的对吗?是的,当TCP连接建立时,当使用SMTPS而不是SMTP+STARTTLS时(尽管在本问题中显示的设置中似乎不是这样),也可以启动TLS。但结果是一样的。@Bruno据我回忆,SMTPS使用SSL,而不是SSLTLS@fge它可以同时使用这两种语言(与实际中的STARTTLS类似),请参阅。本质上,“SSL vs TLS”只是一些电子邮件客户端(如Outlook)使用的一个坏名称。“STARTTLS”中的关键词不是“TLS”,而是“START”。否则,SMTPS类似于HTTPS,您可以启动SSL/TLS连接并在其上使用SMTP(而不是HTTP):当然,您可以将HTTPS配置为使用SSL或TLS(这只是版本/名称更改问题)。