I don’t think everyone clearly understands what Base64 is, such as I didn’t fully understand it before.
First of all, you should know that Base64 is a type of encoding, not a type of encryption.
Many people think Base64 is a type of encryption, but that’s incorrect.

1.encoding vs encryption

1.1 encoding

编码的主要目的是为了转换数据以便于存储或传输,确保数据能够适应某种特定的格式,而不是为了保护数据的安全性。编码不会增加数据的安全性,只是使数据适合在特定环境下被正确处理。

特征

  1. 可逆性:编码是可逆的,意味着编码后的数据可以通过解码过程还原成原始数据。
  2. 公开性:编码后的数据是公开的,任何知道编码规则的人都可以将编码数据还原回原始数据。
  3. 目的:用于确保数据在特定的传输或存储过程中不会因为格式不符而损坏,或者是为了处理一些不能直接显示或传输的字符。

常见例子

  • Base64:通常用于在电子邮件或URL中传输二进制数据。由于邮件系统和URL对某些字符(比如空格和特殊符号)可能不兼容,所以将数据进行Base64编码。
  • URL编码:将一些特殊字符(比如空格、&符号)转换成百分号编码,以便在URL中传输。

例子

  • 将文本 “hello” 编码为Base64时,得到的是 “aGVsbG8=”,这个过程是可逆的,可以解码回原始文本。

1.2 encryption

加密的主要目的是保护数据的隐私性和机密性。通过加密,数据会变得无法被未授权的人理解,即使他们可以访问加密后的数据,也无法恢复出原始数据,除非他们拥有正确的解密密钥。

特征

  1. 不可逆性:加密通常是不可逆的,意味着没有正确的密钥或解密方法,数据无法恢复。
  2. 私密性:加密的目的是保护数据的安全性,只有授权的接收者能够解密并访问原始数据。
  3. 保护数据:加密主要是为了确保数据在传输或存储过程中不被未经授权的人查看或篡改。

常见例子

  • AES(高级加密标准):一种常见的对称加密算法,用于加密文件、通信数据等。
  • RSA:一种非对称加密算法,用于在不安全的网络环境中安全地传输数据,尤其常用于HTTPS协议中。

例子

  • 将文本 “hello” 使用加密算法进行加密时,得到的是一串乱码(比如 “U2FsdGVkX19eZq8jBZtmzCg==”)。这串加密后的数据没有密钥无法恢复成原始文本。
特点 编码 (Encoding) 加密 (Encryption)
目的 转换数据以便存储或传输,不考虑安全性 保护数据的机密性,防止未经授权的访问
可逆性 可逆,编码可以被解码 通常不可逆,只有正确的密钥才能解密
透明性 编码后的数据是公开的,可以轻易还原 加密后的数据是隐藏的,未经授权者无法理解
常见算法 Base64, URL编码 AES, RSA, DES

2.what is Base64 encoding

Base64 的作用就是将任意形式的原始输入(无论是文本、文件还是其他类型的数据)转化为二进制数据后,再进行编码,最终输出的是一个由 Base64 字符集(64 个字符)组成的纯文本字符串。

2.1 The Principle of Base64 encoding

Base64编码的基本思想是通过将每3个字节的二进制数据(24位)分为四个6位,每次处理3个字节(24位),即24位的数据会被分成4个6位的数据单元。 再将每个6位的数据单元 映射为一个Base64字符,从而得到一个可打印的文本。

简单一点儿就是 Base64将每3个字节的二进制数据(24位)编码为4个Base64字符(每个字符6位)。

  • 输出数据的字符集:Base64编码使用64个可打印字符来表示数据,包含64个字符(A-Z, a-z, 0-9, +, /)
    • A-Z: 对应0到25
    • a-z: 对应26到51
    • 0-9: 对应52到61
    • +: 对应62
    • /: 对应63
  • 输出数据的长度 :编码后的结果可以理解成是一个字符串,这个字符串的长度必须是4的倍数, 不足则要通过填充字符“=”来补足
  • 填充字符:填充字符“=”并不参与实际的数据编码,它们只是占位符,用于满足Base64编码的输出格式要求。 如果原始数据的字节数不是3的倍数,则编码结果的长度将不是4的倍数,Base64可以通过添加填充字符“=”来补足编码结果,使得编码后的字符串长度始终是4的倍数。解码时,填充字符会被忽略,只有实际编码的数据会被还原。
  • 数据增长:Base64编码将每3个字节(24位)转换为4个字符,而每个Base64字符是一个字节(8位),所以编码后的数据量会比原始数据大约增加33%
  • 不安全:Base64只是编码,不是加密。它不会提供数据的安全性保护,任何知道Base64编码规则的人都可以解码回原始数据。

2.2 why Base64 encoding is needed

某些传输协议或应用(如电子邮件、URL、HTTP请求等)可能不支持或不允许直接传输二进制数据。比如,电子邮件系统中的内容有时只支持文本格式,而二进制数据(如图片、音频、视频等)则无法直接嵌入。这时候,Base64编码就显得非常有用,它能够将二进制数据转换成可打印的文本形式,确保数据能够顺利传输。

3.Three types of Base64

getDecoder(), getUrlDecoder(), 和 getMimeDecoder()Java 8 中引入的 Base64 类的一部分,它们分别用于解码不同格式的 Base64 编码数据。这些方法都是静态的,位于 java.util.Base64 类中。

3.1 标准 Base64 编码/解码:getEncoder()getDecoder()

  • 编码器:Base64.getEncoder()
  • 解码器:Base64.getDecoder()

特点

  • 使用标准 Base64 字符集:

    1
    A-Z, a-z, 0-9, +, /
  • 标准 Base64 编码结果的填充字符是 =,确保编码结果的长度是 4 的倍数

  • 编码结果是连续字符串,无换行符。
  • 解码时只能处理标准 Base64 格式,任何不兼容符号(如 -_)都会导致解码失败。

适用场景

  • 适合用于常规的编码需求,例如文件内容、API 传输中的数据编码。
  • 如果需要严格遵守标准 Base64 协议,这是首选组合。

3.2 URL 安全 Base64 编码/解码:getUrlEncoder()getUrlDecoder()

  • 编码器:Base64.getUrlEncoder()
  • 解码器:Base64.getUrlDecoder()

特点

  • URL 安全的 Base64 编码符号表:

    1
    A-Z, a-z, 0-9, -, _
  • + 替换为 -,将 / 替换为 _,从而避免特殊字符在 URL 或文件名中被错误解析。

  • 默认情况下,编码结果不包含填充字符 =(但解码器能够识别并处理填充字符)。

这些特殊字符在某些场景下会造成问题:

    • 在 URL 中表示空格
  • / 在 URL 和文件路径中是分隔符
  • = 在 URL 中用于参数赋值

适用场景

  • 当需要将 Base64 数据嵌入到 URL 或文件名中时,避免使用 +/ 和 =这种可能被误解的字符。
  • 适用于 Web 应用、API 参数和文件名编码。

3.3 MIME Base64 编码/解码:getMimeEncoder() 和 `getMimeDecoder()

  • 编码器:Base64.getMimeEncoder()
  • 解码器:Base64.getMimeDecoder()

特点

  • MIME Base64 符号表与标准 Base64 相同
1
A-Z, a-z, 0-9, +, /
  • 编码结果包含换行符,每行最多 76 个字符。
  • 解码器会忽略换行符和空白字符,因此可以处理分段的 Base64 数据。
    适用场景
  • MIME 格式数据的编码和解码,例如电子邮件附件、多媒体数据的嵌入(符合 MIME 协议)。
  • 适用于需要处理大数据量(如文件)并且需要分行显示的场景。

4.Base64 in JWT

JWT 使用URL 安全 Base64 编码/解码

JWT(JSON Web Token) 是一种用于在应用程序和用户之间安全传输信息的开放标准(RFC 7519)。它通常用于认证和信息交换,并且被广泛应用于单点登录(SSO)和API授权等场景。

JWT的结构由三部分组成,Header.Payload.Signature,每一部分都是通过Base64Url编码的字符串。

4.1 Header

  • 将Header JSON对象通过Base64Url编码,生成JWT的第一部分。
    1
    2
    3
    4
    {
    "alg": "HS256",
    "typ": "JWT"
    }

4.2 Payload

  • 包含实际的数据(称为“声明”),例如用户ID、角色、过期时间等。
  • 将Payload JSON对象通过Base64Url编码,生成JWT的第二部分。
    1
    2
    3
    4
    5
    {
    "sub": "1234567890",
    "name": "John Doe",
    "iat": 1516239022
    }

4.3 Signature

  • 用于验证JWT的完整性,防止数据被篡改。
  • 签名是通过对Header和Payload的Base64Url编码结果进行哈希计算生成的。
  • 签名结果也会通过Base64Url编码,生成JWT的第三部分。
    1
    2
    3
    4
    HMACSHA256(
    base64UrlEncode(header) + "." + base64UrlEncode(payload),
    secret
    )

5.Base64 in HTTP Authorization

Base64也在HTTP权限校验中有着重要应用,最典型的是HTTP Basic AuthenticationBearer Token认证

5.1 Basic Authentication

Basic Authentication 是HTTP协议中一种常见的认证方法,它通过在HTTP请求头中传递Base64编码的用户名和密码来实现身份验证。

基本的认证方式是将用户名和密码以username:password的格式拼接在一起,然后对其进行Base64编码,最后将编码后的结果放在HTTP请求的Authorization头部。
服务器接收到请求后,会将该Base64编码解码回username:password,并进行验证。

1
2
Authorization: Basic <Base64编码的"username:password">
Authorization: Basic YWRtaW46cGFzc3dvcmQxMjM=

5.2 Bearer Token Authentication

Bearer Token认证是一种常见的方式,特别是OAuth2协议中。这个过程涉及到使用一个令牌(Token)来验证请求,而这个令牌通常是一个JWT或其他类型的Token。所以Base64常用于传递JWT或其他类型的Token。

1
Authorization: Bearer <Token>

其中<Token>可能是一个Base64编码的JWT。比如:

1
Authorization: Bearer eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9.eyJzdWIiOiAiMTIzNDU2Nzg5MCIsICJuYW1lIjogIkpvaG4gRG9lIiwgImlhdCI6IDE1MTYyMzkwMjJ9.s9tSt0jp_J3HjlU6baVuWbBb9zY_xFv7do1_a4e-j24