Base64和Base64URL
Base64 编码简介
首先,Base64 是一种编码方式,而不是真正的加密方式。即使算,Base64 也仅用作一个简单的“加密”来保护某些数据,而真正的加密通常都比较繁琐。
Base64 使用64个通用的可打印字符来存储和表示二进制数据,同时也可以进行简单的加密,生成不可读文本。Base64字符集包括大、小写英文字母,阿拉伯数字0-9,以及“+”和“/”,以及作后缀填充的“=”共计65个字符,其中编码时只使用前64个。
如何使用这64个字符来表示二进制数据呢?
这就需要在十进制的0-63以及使用的64个字符之间建立一一对应关系。具体的映射是将十进制的0-63依次与“A-Z”,“a-z”,“0-9”,“+”,“/”一一对应。在计算机中64种可能只需要6bit就能表达(2的6次方=64),因此Base64表示法实质上是以6bit为单位,使用规定的通用字符来表示和存储二进制数据。
Base64编码表
码值 | 字符 | 码值 | 字符 | 码值 | 字符 | 码值 | 字符 |
---|---|---|---|---|---|---|---|
0 | A | 16 | Q | 32 | g | 48 | w |
1 | B | 7 | R | 33 | h | 49 | x |
2 | C | 18 | S | 34 | i | 50 | y |
3 | D | 19 | T | 35 | j | 51 | z |
4 | E | 20 | U | 36 | k | 52 | 0 |
5 | F | 21 | V | 37 | l | 53 | 1 |
6 | G | 22 | W | 38 | m | 54 | 2 |
7 | H | 23 | X | 39 | n | 55 | 3 |
8 | I | 24 | Y | 40 | o | 56 | 4 |
9 | J | 25 | Z | 41 | p | 57 | 5 |
10 | K | 26 | a | 42 | q | 58 | 6 |
11 | L | 27 | b | 43 | r | 59 | 7 |
12 | M | 28 | c | 44 | s | 60 | 8 |
13 | N | 29 | d | 45 | t | 61 | 9 |
14 | O | 30 | e | 46 | u | 62 | + |
15 | P | 31 | f | 47 | v | 63 | / |
使用工具 http://www.lzltool.com/base64 可以在线解析Base64,将Base64转换成字符串或十六进制、或Base64Url格式
Base64URL编码简介
由于标准的Base64编码中可能出现“+”和“/”,在URL中就不能直接作为参数,所以又有一种“url safe”的base64编码,其实就是把字符“+”和“/”分别变成“-”和“_”
由于“=”字符也可能出现在Base64编码中,但“=”用在URL、Cookie里面会造成歧义,所以,Base64URL编码后会把“=”去掉。去掉“=后怎么解码呢?因为Base64是把3个字节变为4个字节,所以,Base64编码的长度永远是4的倍数,因此,需要加上“=”把Base64字符串变为4的倍数,就可以正常解码了。
使用工具 http://www.lzltool.com/base64url 可以在线解析Base64URL,将Base64URL转换成字符串或十六进制、或Base64格式
总结
BASE64URL编码的流程:
1、明文使用BASE64进行加密
2、在BASE64的基础上进行一下的编码:
1)去除尾部的"="
2)把"+“替换成”-"
3)把"/“替换成”_"
BASE64URL解码的流程:
1、把BASE64URL的编码做如下解码:
1)把"-“替换成”+"
2)把"_“替换成”/"
3)(计算BASE64URL编码长度)%4
a)结果为0,不做处理
b)结果为2,字符串添加"=="
c)结果为3,字符串添加"="
2、使用BASE64解码密文,得到原始的明文
java Base64加密解密代码
import java.util.Base64;
public class Base64Encryption {
public static String encode(String str) {
return Base64.getEncoder().encodeToString(str.getBytes());
}
public static String decode(String str) {
byte[] decodedBytes = Base64.getDecoder().decode(str);
return new String(decodedBytes);
}
}
java Base64URL加密解密代码
import java.util.Base64;
public class Base64URL {
public static String encode(String input) {
byte[] encodedBytes = Base64.getUrlEncoder().encode(input.getBytes());
return new String(encodedBytes);
}
public static String decode(String input) {
byte[] decodedBytes = Base64.getUrlDecoder().decode(input.getBytes());
return new String(decodedBytes);
}
}