微服务场景下传输必须用tls(优先mtls)、认证用jwt(rs256)、加密存储用aes-256-gcm+bcrypt,因tls是防窃听篡改冒充的底线基础设施,rs256实现密钥隔离更安全,aes-256-gcm提供加密与认证一体化,bcrypt专用于密码哈希,而md5、rsa直加密、aes-ecb等或不安全或低效或职责错位。

直接说结论:微服务场景下,传输用 TLS(优先 mTLS),认证用 JWT(RS256),加密存储用 AES-256-GCM + bcrypt。其他算法要么不安全(如 MD5、ECB 模式 AES),要么效率低(如纯 RSA 加密大段数据),要么职责错位(如 SHA-256 不能当加密用)。
为什么 TLS 是微服务通信的底线,不是“可选项”
TLS 不是锦上添花,而是防止中间人窃听、篡改、冒充服务的基础设施。Golang 的 http.ListenAndServeTLS 或 grpc.Credentials.TransportCredentials 调用后,整个 HTTP/gRPC 流量自动加密,无需修改业务逻辑。
- 必须用 TLS 1.2 或更高版本;TLS 1.0/1.1 已被主流平台弃用
- 生产环境禁用自签名证书直连——客户端需校验 CA 信任链,否则
x509: certificate signed by unknown authority错误频发 - 高安全场景(如金融、权限系统)必须启用 mTLS:
tls.Config{ClientAuth: tls.RequireAndVerifyClientCert},否则服务端无法确认调用方身份 - 证书私钥文件(如
server.key)必须严格限制读取权限(chmod 600),否则等于裸奔
JWT 该用 HS256 还是 RS256?看密钥管理能力
HS256 要求所有服务共享同一个密钥,密钥一旦泄露,整个认证体系崩溃;RS256 用私钥签名、公钥验签,服务只需持有公钥,更易隔离风险。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
- 内部微服务间通信,推荐 RS256:用
github.com/golang-jwt/jwt/v5生成 token,服务 B 用公钥调用token.Valid()验证 - 不要在 JWT payload 中放密码、身份证号等敏感字段——它只是身份凭证,不是保险箱
-
exp字段必须设置(如 15 分钟),且服务端要主动检查:token.Claims.(jwt.MapClaims)["exp"],否则过期 token 仍能通行 - 避免把 JWT 存在 localStorage——XSS 攻击可直接盗取;应存在 httpOnly cookie 中
AES-256-GCM 是加密存储唯一靠谱选择
CBC 模式需要手动处理 PKCS7 填充、IV 传递和 MAC 校验,极易出错;GCM 一步到位:加密+认证,解密失败时直接 panic,不会返回篡改后的脏数据。
- 密钥(
key)必须 32 字节(AES-256),且绝不能硬编码在代码里——用 KMS 或环境变量注入 - Nonce(即 IV)必须每次加密随机生成,长度固定为
gcm.NonceSize()(通常 12 字节),和密文一起存库即可(无需保密) - 禁止用
crypto/aes手写 ECB/CBC 加密密码字段——密码必须哈希,不是加密:bcrypt.GenerateFromPassword才是正解 - 敏感字段(如手机号、地址)单独 AES 加密后存库,查询时再解密;但注意:加解密会拖慢 SQL 查询,高频字段慎用
哪些“看起来很厉害”的算法其实不该用
MD5、SHA-1、RSA 直接加密大文本、AES-ECB、自研混淆算法——这些在微服务里不是“不够好”,而是“根本不能用”。
-
md5.Sum和sha1.Sum只能用于校验文件完整性,**绝不能用于密码哈希**——彩虹表秒破 - RSA 加密超过 245 字节(2048 位密钥)会 panic,想加密长数据必须走混合模式:用 RSA 加密 AES 密钥,再用 AES 加密正文
-
base64.StdEncoding.EncodeToString不是加密——它只是编码,Base64 后的数据和原文一样裸露 - 任何没经过 NIST 或 IETF 认证的“自研加密协议”,上线即等于给攻击者送钥匙
最常被忽略的一点:加密本身不解决密钥生命周期问题。哪怕用了 AES-256-GCM,如果密钥三年不轮换、不审计访问日志、不监控解密失败率突增,安全水位依然归零。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










