【问题标题】:Does net/smtp send credentials in plain text?net/smtp 是否以纯文本形式发送凭据?
【发布时间】:2015-07-21 09:19:06
【问题描述】:

我在看这个例子。 http://golang.org/pkg/net/smtp/#example_PlainAuth

package main

import (
    "log"
    "net/smtp"
)

func main() {
    // Set up authentication information.
    auth := smtp.PlainAuth("", "user@example.com", "password", "mail.example.com")

    to := []string{"recipient@example.net"}
    mesg := []byte("This is the email body.")

    err := smtp.SendMail("mail.example.com:25", auth, "sender@example.org", to, mesg)
    if err != nil {
        log.Fatal(err)
    }
}

smtp.PlainAuth 是否以纯文本形式向邮件服务器发送凭据?在野外使用 net/smtp 是否安全?

【问题讨论】:

    标签: security email go smtp


    【解决方案1】:

    PlainAuth 使用 RFC 4616 中的 Plain auth mech,即明文形式的用户名/密码。通常,当您使用它时,加密将在较低级别进行处理,例如您将创建一个 TLS 连接。然后在上面使用PlainAuth。如果您不是通过加密连接进行交谈,那么使用 PlainAuth 可能会有风险,就好像流量被拦截一样,用户/通行证很容易获得。

    但如果您阅读,您会看到SendMail 函数显示以下内容:

    SendMail 在 addr 连接到服务器,如果可能,切换到 TLS,如果可能,使用可选机制 a 进行身份验证,然后从 address from 到 address to 发送一封电子邮件,并带有消息 msg。

    因此,它会在可能的情况下尝试自动升级到 TLS。所以只要你使用的是支持 TLS 的服务器,你应该是相对安全的。另一个 Auth 选择是 CramMD5,但这种方法的服务器支持通常不如大多数东西都支持的 PlainAuth 常见。

    【讨论】:

    • 我如何知道我的服务器是否支持 TLS?我需要安装其他程序吗?我需要 TLS 证书吗?
    • 您是运行自己的服务器还是使用别人的服务器?如果你拥有?您是否在 MTA 上配置了 TLS / SSL?您需要配置 SSL 证书(它可以是自签名的,但您可能会遇到某些程序的问题 - 不确定 go,但假设它与 openssl 链接,那么您可能会遇到自签名问题)
    • 大多数时候,我在 DigitalOcean 上运行我自己的服务器。
    • 那么您需要配置/启用 tls 作为服务器/droplet 的一部分。如果代码在同一台服务器 /droplet 上运行,您可能不需要 auth / tls。因为在这种情况下您的攻击面很小。
    • 将 TLS 配置为“作为服务器的一部分”是否类似于为 Web 服务器设置 TLS 证书?还是完全不同的过程?
    猜你喜欢
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 2021-07-23
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    相关资源
    最近更新 更多