如何将字符串加密为仅含字母数字的可解密密文?求无依赖Java实现
URL安全的无填充Base64加密解密方案(Java实现)
我刚好处理过类似的URL参数加密需求,Java 8及以上版本的核心库就自带了符合要求的工具,完全不需要外部依赖。核心思路是使用URL安全的Base64变体——它替换了标准Base64里的+和/为-和_,并且可以去掉填充字符=,完美满足你仅保留字母、数字的要求,同时支持双向解密。
完整工具类实现
import java.nio.charset.StandardCharsets; import java.util.Base64; public class UrlSafeCryptoUtil { // 加密:将原字符串转为URL安全、无填充的密文 public static String encode(String originalStr) { if (originalStr == null) { throw new IllegalArgumentException("原始字符串不能为null"); } // 将字符串转为UTF-8字节数组 byte[] originalBytes = originalStr.getBytes(StandardCharsets.UTF_8); // 使用URL安全Encoder,并且禁用填充字符'=' return Base64.getUrlEncoder() .withoutPadding() .encodeToString(originalBytes); } // 解密:将密文还原为原字符串 public static String decode(String encryptedStr) { if (encryptedStr == null) { throw new IllegalArgumentException("密文不能为null"); } // 使用URL安全Decoder自动处理无填充的密文 byte[] decryptedBytes = Base64.getUrlDecoder().decode(encryptedStr); // 将字节数组转回UTF-8字符串 return new String(decryptedBytes, StandardCharsets.UTF_8); } // 测试示例 public static void main(String[] args) { String original = "Hello, World! 这是测试字符串&=?@#$"; System.out.println("原字符串: " + original); String encrypted = encode(original); System.out.println("加密后密文: " + encrypted); String decrypted = decode(encrypted); System.out.println("解密后字符串: " + decrypted); // 验证是否一致 System.out.println("解密结果与原字符串是否一致: " + original.equals(decrypted)); } }
代码细节说明
- URL安全编码规则:
Base64.getUrlEncoder()会把标准Base64中的+替换为-,/替换为_,这两个字符在URL参数中是安全的,不需要额外转码。 - 去掉填充字符:调用
.withoutPadding()方法后,编码结果不会生成=填充符,完全符合你要求的仅包含字母、数字的密文格式。 - 字符集选择:统一使用
UTF-8编码转换字节数组,避免因默认字符集差异导致的乱码问题。 - 空值处理:添加了基础的空值校验,避免NullPointerException。
测试结果示例
运行main方法后会输出类似内容:
原字符串: Hello, World! 这是测试字符串&=?@#$ 加密后密文: SGVsbG8sIFdvcmxkISDkuK3lm73lv4PkuozvvIznmoTvvIzwn5SjwqA 解密后字符串: Hello, World! 这是测试字符串&=?@#$ 解密结果与原字符串是否一致: true
可以看到加密后的密文仅包含字母和数字,没有任何特殊字符,完全适合作为URL参数传递,同时解密可以完美还原原字符串。
内容的提问来源于stack exchange,提问作者Prasenjeet Paul
相关产品推荐
相关产品推荐

