在本地微服务之间交换纯文本密码是一种好的编程习惯吗?

Is it a good programming practice to exchange plain text passwords between local microservices?

我有两个微服务。微服务 A 正在向微服务 B 发送请求以在系统中注册用户,请求中有一个明文密码。这些服务之间的数据交换是基于 HTTP 的。

这些微服务之间的连接是纯本地的,所以基本上我不应该担心密码泄露,但是即使在两个本地微服务之间也不对密码进行编码真的是一个好的编程习惯吗?

如前所述,您至少应使用 https 对服务之间的数据流进行编码。

此外,最好查看 JWT(JSON Web 令牌)或类似的常用技术来保护服务。使用 JWT,您无需交换始终不安全的密码(想想网络嗅探器)。

规则是绝不能通过不安全的连接以纯文本形式交换敏感信息。如果你在一个完全封闭的环境中,通常是同一台主机中的 2 个服务,加密无关紧要。但是,如果应用程序分为多个服务,这些服务以后可能会托管在更远的地方,它们之间的网络安全性较低。

在这种情况下,一种简单的方法是使用 SSL 保护整个连接。 HTTPS 对于现在的服务器来说不再是一个太重的负载,所以它是一种加密客户端和服务器部分之间所有内容的简单方法。

好的一点是,通过代理和反向代理,可以很容易地保护两个 java 服务之间的通信,而服务本身不会看到它。因此,如果出于任何原因您无法在微服务内部直接处理 HTTPS,您始终可以依靠 Apache 或 nginx(反向)代理来加密微服务之间的通信,以免稍后使用不安全的网络。顺便说一句,这是在 Java servlet 上使用 HTTPS 的常用方法:servlet 托管在 Tomcat(或任何其他 servlet 容器)中,并隐藏在 Apache httpd 服务器(或任何其他反向代理)后面) 处理 HTTPS 部分,并且可以选择提供静态内容。

你可以使用,

  1. Base-64 编码密码(不是 encryption/Hashing)用于在两个服务之间传输密码(如果不是敏感信息)。
  2. 建议在电汇中使用 SSL/TSL over HTTPS 协议。
  3. 不要传递计划文本密码,而是尝试使用令牌。 (示例:传递 JWT 令牌并在其他服务中验证)[快速阅读:https://stormpath.com/blog/microservices-jwt-spring-boot]

希望这会有所帮助。