Go 中 HTTP 加密必须使用 TLS,http.ListenAndServeTLS 是唯一安全方式;应用层加密仅作补充,须用 ChaCha20Poly1305 或 AES-GCM,严禁手动实现密码学逻辑、硬编码密钥或传输密钥。
Go 默认的
和
不加密,必须用 HTTPS
Go 的标准库本身不提供“在 HTTP 层手动加解密”的能力——这不是设计目标。想让网络数据加密,最直接、最安全、也是唯一被广泛接受的方式,就是走 TLS。也就是说:
是明文的,
才是加密的。
常见错误是试图在
里对
写入前做 AES 加密,或对
手动解密。这不仅破坏 HTTP 协议语义(比如 Content-Length、gzip 压缩、代理兼容性),还会让客户端无法解析,且完全绕过 TLS 的身份认证和密钥协商,形同裸奔。
实操建议:
生成合法证书(推荐用
本地签发,或从 Let’s Encrypt 获取)
服务端启动时指定证书路径:
客户端必须用
开头请求,且默认校验证书;若跳过校验(仅限测试),需自定义
需要应用层加密?明确区分「传输加密」和「内容加密」
极少数场景确实要额外加密 payload,比如:API 要求敏感字段(如身份证号)即使在 TLS 链路内也二次加密;或后端服务间通信需按业务密钥隔离。这时不是替代 TLS,而是叠加。
立即学习
“
go语言免费学习笔记(深入)
”;
关键原则:不要自己实现 AEAD 密码学逻辑。优先用
或
+
。
示例要点:
密钥不能硬编码,应通过环境变量或 KMS 注入;每次加密必须用唯一
(ChaCha20Poly1305 要求 24 字节,AES-GCM 推荐 12 字节)
加密后把
和密文拼接(如
),解密时先切分
HTTP header 中可加
标识,但不要依赖它做安全判断
避免在 URL 参数或 cookie 中传加密数据——长度不可控、易被日志截断、base64 编码可能含
/
引发路由歧义
的 TLS 配置决定加密强度和兼容性
Go 默认启用 TLS 1.2+,禁用 SSLv3 和 TLS 1.0/1.1,但具体行为受
控制。若对接老旧系统或有合规要求(如国密、FIPS),必须显式配置。
容易被忽略的点:
和
直接影响握手是否成功;设为
可能导致某些 Java 8 客户端失败
自签名证书需把 CA 证书加入
,否则
若服务端强制双向认证(mTLS),客户端必须提供
和
配置
性能上,
可让服务端主导套件选择,更利于启用 ChaCha20
别碰
、
和手写 PKCS#7 填充
这些要么已被证明不安全(RC4、DES),要么标准库已弃用(
在 Go 1.22+ 中标记为 deprecated),要么极易出错(PKCS#7 填充边界处理、ECB 模式重放攻击)。
真实项目中,只要出现以下任意一种写法,基本可以判定加密方案存在风险:
用
但没校验 IV 随机性
加密前对 JSON 字符串做
再加密(实际应加密原始字节)
把 AES 密钥直接用
衍生(应使用
或
)
在 HTTP header 中传递
(密钥永远不能走传输通道)
加密不是功能开关,是纵深防御的一环。TLS 是底线,应用层加密是补充,而密钥生命周期管理——才是最容易崩塌的那一环。
httpnet/httphttp.ListenAndServehttp.ListenAndServeTLShttp.HandlerResponseWriterRequest.Bodymkcerthttp.ListenAndServeTLS(":443", "server.crt", "server.key", handler)https://http.Client.Transport.TLSClientConfig.InsecureSkipVerify = truegolang.org/x/crypto/chacha20poly1305crypto/aescrypto/cipher.NewGCMnoncenoncenonce || ciphertextX-Encrypted: aes-gcm+/http.Transporttls.ConfigTLSClientConfig.MinVersionMaxVersiontls.VersionTLS13TLSClientConfig.RootCAsx509: certificate signed by unknown authorityTLSClientConfig.CertificatesClientAuthtls.Config.PreferServerCipherSuites = truecrypto/rc4crypto/descrypto/descrypto/cipher.NewCBCDecrypterbase64.StdEncoding.DecodeStringmd5(password)golang.org/x/crypto/scryptpbkdf2X-AES-Key