接口加密传输中的中文乱码问题

12 阅读1分钟

接口加密传输中的中文乱码问题

背景

服务端与客户端(如安卓端)之间的接口调用,需要对报文进行加解密处理。由于服务端与客户端的运行环境可能不同,它们默认的字符集也可能不一致。如果加密和解密过程中没有明确指定字符集编码,很容易出现中文乱码问题。

问题描述
  • 加密过程:服务端在加密前,将字符串转换为字节数组时未明确指定字符集,使用了系统默认字符集(这受服务器环境变量如LANG的影响)。
  • 解密过程:安卓端在接收到加密数据并解密后,将字节数组转换回字符串时,由于未明确指定字符集,且安卓端的默认字符集可能与服务端不一致,导致中文数据出现乱码。
解决方案
方案一:明确指定字符集(推荐)

无论是服务端还是客户端,都应在字符串与字节数组相互转换时明确指定字符集。如UTF-8字符集。

// RSA 加密
String originalMessage = "包含中文的报文";
byte[] originalMessageBytes = originalMessage.getBytes(StandardCharsets.UTF_8);
byte[] encryptBytes = RSAUtils.encryptByPublicKey(originalMessageBytes, publicKey);

// RSA 解密
byte[] decryptBytes = RSAUtils.decryptByPrivateKey(decodeBytes, privateKey);
String decryptedMessage = new String(decryptBytes, StandardCharsets.UTF_8);
方案二:设置服务器LANG环境变量(备选)

虽然这不是解决乱码问题的直接方法,但在某些情况下,调整服务器的环境变量(如LANG设置为en_US.UTF-8)可以间接影响Java平台默认使用的字符集。

操作示例(在Linux环境下):

export LANG=en_US.UTF-8