WMX · 随记
·Java· 3 分钟阅读

Base64 是编码:可读性降低不等于保密

把令牌或用户数据做 Base64 后放进 URL,不会让它成为秘密。任何拿到文本的人都可以执行反向解码。

Java 系列概览:类型与值、状态与资源、边界验证
Java 系列概览:类型与值、状态与资源、边界验证 点击图片查看大图 ↗

问题从哪里出现

把令牌或用户数据做 Base64 后放进 URL,不会让它成为秘密。任何拿到文本的人都可以执行反向解码。

理解核心机制

Base64 把字节表示为文本,方便在某些协议中传输。标准、URL 安全和 MIME 变体有不同字符或换行规则。需要保密时使用经过设计的加密协议,需要防篡改则要单独考虑认证。

动手做一个小实验

Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。

Java10 行 · 可横向滚动
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class Demo {
    public static void main(String[] args) {
        byte[] input = "hello".getBytes(StandardCharsets.UTF_8);
        String text = Base64.getUrlEncoder().withoutPadding().encodeToString(input);
        System.out.println(text);
        System.out.println(new String(Base64.getUrlDecoder().decode(text), StandardCharsets.UTF_8));
    }
}

适用边界与常见误区

编码后长度通常增加,不能把它当作压缩。登录凭证也不应该因为“看不懂”就被放心写入日志。

继续练习

对不同长度字节数组进行往返编码,检查结果是否一致;再比较标准与 URL 安全变体的字符差别。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档