You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将字符串加密为仅含字母数字的可解密密文?求无依赖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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:11:27