java中BASE64加密/解密详解(附带源码)

 更新时间:2025年05月06日 10:37:43   作者:Katie。  
这篇文章主要介绍了java中BASE64加密/解密的相关资料,并详细展示了如何在Java中使用内置的Base64类进行编码和解码,文章还涵盖不同类型的Base64编码及其应用场景,需要的朋友可以参考下

1. 项目背景与介绍

在日常开发中,Base64 编码是一种常见的数据处理方式,广泛应用于以下场景:

  • 数据传输:将二进制数据转换为 ASCII 字符串,方便在文本协议(如 JSON、XML)中传输。
  • 数据存储:避免特殊字符导致的数据解析错误,例如在 URL 或 Cookie 中存储二进制数据。
  • 加密辅助:用于编码密钥、证书、公私钥等,但 Base64 本身并不是加密算法,它只是编码方式。

本项目将展示如何使用 Java 内置的 Base64 类进行 Base64 编码(加密)和解码(解密)。

2. 相关知识

2.1 Base64 简介

Base64 是一种基于 64 个可打印字符的编码方式,它可以将 任意二进制数据转换为 ASCII 字符串,避免在传输或存储时出现编码问题。

Base64 采用的 64 个字符如下(大小写字母 + 数字 + 两个符号):

ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789
+/

此外,Base64 可能会在末尾填充 = 号,使其长度为 4 的倍数。

2.2 Java Base64 类

从 Java 8 开始,java.util.Base64 提供了三种 Base64 编码器:

编码器说明
Base64.getEncoder()标准 Base64 编码
Base64.getUrlEncoder()URL 安全的 Base64 编码(+ 替换为 -/ 替换为 _
Base64.getMimeEncoder()MIME 编码(每 76 个字符换行)

相应地,解码器 Base64.getDecoder() 可以将 Base64 字符串转换回原始数据。

3. 项目实现思路

  • 编码(加密)
    • 通过 Base64.getEncoder().encodeToString(byte[]) 方法,将字符串转换为 Base64 编码格式。
  • 解码(解密)
    • 通过 Base64.getDecoder().decode(String) 方法,将 Base64 编码的数据转换回原始字符串。
  • 实现不同 Base64 变体
    • 标准 Base64:用于常规数据编码。
    • URL Base64:适用于 URL 传输,避免 + 和 / 影响 URL 解析。
    • MIME Base64:适用于电子邮件或其他需要换行的场景。

4. 完整代码实现

以下 Java 代码实现了 Base64 编码和解码功能,支持三种模式(标准、URL 安全、MIME)。

import java.util.Base64;

/**
 * Base64EncoderDecoder 类用于演示 Java 8 提供的 Base64 编码和解码功能。
 * 该类支持三种编码模式:标准 Base64、URL 安全 Base64、MIME Base64。
 */
public class Base64EncoderDecoder {

    /**
     * 使用标准 Base64 编码字符串
     *
     * @param input 原始字符串
     * @return Base64 编码后的字符串
     */
    public static String encodeBase64(String input) {
        return Base64.getEncoder().encodeToString(input.getBytes());
    }

    /**
     * 使用标准 Base64 解码字符串
     *
     * @param base64Str Base64 编码的字符串
     * @return 解码后的原始字符串
     */
    public static String decodeBase64(String base64Str) {
        byte[] decodedBytes = Base64.getDecoder().decode(base64Str);
        return new String(decodedBytes);
    }

    /**
     * 使用 URL 安全的 Base64 编码字符串
     *
     * @param input 原始字符串
     * @return URL 安全的 Base64 编码字符串
     */
    public static String encodeBase64Url(String input) {
        return Base64.getUrlEncoder().encodeToString(input.getBytes());
    }

    /**
     * 使用 URL 安全的 Base64 解码字符串
     *
     * @param base64UrlStr URL 安全的 Base64 编码字符串
     * @return 解码后的原始字符串
     */
    public static String decodeBase64Url(String base64UrlStr) {
        byte[] decodedBytes = Base64.getUrlDecoder().decode(base64UrlStr);
        return new String(decodedBytes);
    }

    /**
     * 使用 MIME Base64 编码字符串(适用于邮件和换行文本)
     *
     * @param input 原始字符串
     * @return MIME Base64 编码的字符串
     */
    public static String encodeBase64Mime(String input) {
        return Base64.getMimeEncoder().encodeToString(input.getBytes());
    }

    /**
     * 主方法,测试 Base64 编码与解码
     *
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        String originalString = "Hello, Base64!";

        // 标准 Base64 编码/解码
        String encoded = encodeBase64(originalString);
        String decoded = decodeBase64(encoded);

        System.out.println("原始字符串: " + originalString);
        System.out.println("Base64 编码: " + encoded);
        System.out.println("Base64 解码: " + decoded);

        // URL Base64 编码/解码
        String urlEncoded = encodeBase64Url(originalString);
        String urlDecoded = decodeBase64Url(urlEncoded);

        System.out.println("\nURL 安全 Base64 编码: " + urlEncoded);
        System.out.println("URL 安全 Base64 解码: " + urlDecoded);

        // MIME Base64 编码(用于邮件等换行文本)
        String mimeEncoded = encodeBase64Mime(originalString);
        System.out.println("\nMIME Base64 编码: " + mimeEncoded);
    }
}

5. 代码解读

5.1 标准 Base64 编码

  • 使用 Base64.getEncoder().encodeToString(byte[]) 将字符串转换为 Base64 编码格式。
  • 解码时使用 Base64.getDecoder().decode(String),转换回原始字符串。

5.2 URL 安全 Base64 编码

  • Base64.getUrlEncoder() 生成的 Base64 字符串避免了 + 和 /,适用于 URL 传输。
  • Base64.getUrlDecoder() 进行解码。

5.3 MIME Base64 编码

  • Base64.getMimeEncoder() 适用于需要换行的场景(如电子邮件、长文本)。
  • 由于 MIME 形式的 Base64 可能包含换行符,解码时需注意处理换行问题。

6. 项目总结与扩展

6.1 本项目的收获

  • 掌握 Base64 基本原理:理解 Base64 如何转换二进制数据为可打印字符,及其应用场景。
  • 熟悉 Java Base64 API:学会使用 Base64 类进行标准、URL 安全和 MIME 编码/解码。
  • 区分编码与加密:Base64 只是编码方式,不具备加密能力,应与加密算法结合使用(如 AES + Base64)。

6.2 可能的扩展方向

  • 结合 AES、RSA 加密:Base64 可用于存储和传输加密数据。
  • 结合 JWT 认证:JWT 的 payload 采用 Base64 编码。
  • 应用于 HTTP 认证:Basic Auth 使用 Base64 传输用户名和密码(但不安全,应配合 HTTPS)。

通过本项目的实现,读者不仅可以掌握 Base64 编码/解码的基本方法,还能更好地理解其在信息传输和数据存储中的实际应用。希望这篇文章能帮助你深入理解 Base64 技术,并在项目中灵活应用。

总结

到此这篇关于java中BASE64加密/解密的文章就介绍到这了,更多相关java BASE64加密/解密内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于SpringCloud手写一个简易版Sentinel

    基于SpringCloud手写一个简易版Sentinel

    SpringCloud Alibaba Sentinel是当前最为流行一种熔断降级框架,简单易用的方式可以快速帮助我们实现服务的限流和降级,保证服务的稳定性。
    2021-05-05
  • 深入理解Java中的WeakHashMap

    深入理解Java中的WeakHashMap

    这篇文章主要介绍了深入理解Java中的WeakHashMap,WeakHashMap从名字可以得知主要和Map有关,不过还有一个Weak,我们就更能自然而然的想到这里面还牵扯到一种弱引用结构,因此想要彻底搞懂,我们还需要知道四种引用,需要的朋友可以参考下
    2023-09-09
  • jdk7 中HashMap的知识点总结

    jdk7 中HashMap的知识点总结

    HashMap的原理是老生常谈了,不作仔细解说。一句话概括为HashMap是一个散列表,它存储的内容是键值对(key-value)映射。这篇文章主要总结了关于jdk7 中HashMap的知识点,需要的朋友可以参考借鉴,一起来看看吧。
    2017-01-01
  • java判断String类型是否能转换为int的方法

    java判断String类型是否能转换为int的方法

    今天小编就为大家分享一篇java判断String类型是否能转换为int的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • IDEA配置SpringBoot热启动,以及热启动失效问题

    IDEA配置SpringBoot热启动,以及热启动失效问题

    这篇文章主要介绍了IDEA配置SpringBoot热启动,以及热启动失效问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • SpringBoot整合ES解析搜索返回字段问题

    SpringBoot整合ES解析搜索返回字段问题

    这篇文章主要介绍了SpringBoot整合ES解析搜索返回字段问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • Spring Boot 配置 Hikari 数据库连接池的操作代码

    Spring Boot 配置 Hikari 数据库连接池的操作代码

    数据库连接池是一个提高程序与数据库的连接的优化,连接池它主要作用是提高性能、节省资源、控制连接数、连接管理等操作,这篇文章主要介绍了SpringBoot配置Hikari数据库连接池,需要的朋友可以参考下
    2023-09-09
  • spring cloud Hystrix断路器的使用(熔断器)

    spring cloud Hystrix断路器的使用(熔断器)

    这篇文章主要介绍了spring cloud Hystrix断路器的使用(熔断器),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • Java成员变量的隐藏(实例讲解)

    Java成员变量的隐藏(实例讲解)

    下面小编就为大家带来一篇Java成员变量的隐藏(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • 深入解析Java的Servlet过滤器的原理及其应用

    深入解析Java的Servlet过滤器的原理及其应用

    这篇文章主要介绍了深入解析Java的Servlet过滤器的原理及应用,Java编写的Servlet通常是一个与网页一起作用于浏览器客户端的程序,需要的朋友可以参考下
    2016-01-01

最新评论