Base64 编码与 URL 编码介绍
Base64 编码与 URL 编码介绍
lololoweBase64编码
首先看一个例子,在终端中使用Base64工具对字符串”mkbk”进行编码,得到以下输出:
1 | root@Debian:~# echo -n "mkbk" | base64 |
注意:
echo
命令的-n
参数用于去除echo
命令自动添加的换行符。也可以用printf
命令代替echo -n
命令。
编码过程如下:
- 根据ASCII编码表将每个字符转换成对应的十进制,得到以下结果:
m | k | b | k |
---|---|---|---|
109 | 107 | 98 | 107 |
注意:在终端中查看ascii编码表可以用
ascii -d
命令,如果命令不存在,可以使用sudo apt install ascii
安装。
- 将每个十进制数转换成八位二进制数,得到以下结果:
109 | 107 | 98 | 107 |
---|---|---|---|
01101101 | 01101011 | 01111010 | 01101011 |
- 将二进制数按照6位一组进行分组,不足6位的在末尾补0,得到以下结果:
011011 | 010110 | 101101 | 111010 | 011010 | 110000 |
- 将每组二进制数转换成对应的十进制,得到以下结果:
011011 | 010110 | 101101 | 111010 | 011010 | 110000 |
---|---|---|---|---|---|
27 | 16 | 45 | 58 | 26 | 48 |
- 按照Base64编码表将每个十进制数转换成对应的字符,得到以下结果:
b | W | t | i | a | W |
注意:Base64编码表中的字符包括字母A~Z、a~z、数字0~9、+和/,共64(0~63)个字符。
- 如果分组后的字符数不是4的倍数,则在末尾添加
=
字符,直到字符数是4的倍数,得到以下结果:
bWti | aW== |
- 最后将分组后的字符拼接起来,得到最终结果:
bWtiaW==
URL编码
根据RFC 1738的规定:在HTTP请求时,必须对保留字符进行URL编码,而未保留字符无需编码。
保留字符是指容易造成歧义的特殊字符,比如正斜杠(/)用于分隔URL中的路径,如果不对它进行编码,那么浏览器可能会将其误认为是路径分隔符,导致URL无法正确解析。
保留字符有以下这些:
未保留字符如下:
注意:保留字符和未保留字符之外的字符一律需要进行URL编码。比如汉字、法语等。
URL编码的规则是,将字符的ASCII的值表示为两个16进制的数字,然后在其前面放置一个转义字符(%),再替换回URL中的相应位置。(对于非ASCII字符,需要转换为UTF-8字节序,然后每个字节按照上述方式表示。)例如,空格的ASCII值为32,URL编码之后为%20(20是32的十六进制值)。
注意:百分号单独使用时需要用
%25
(25是%的十六进制值)来表示,否则百分号会被当做转义字符。
下面用一个例子来说明URL编码的必要性,使用cURL工具对 https://cn.bing.com/search?q=几点了
这个URL进行请求,得到以下结果:
可以看到服务端返回了400状态码,说明请求未被服务端理解。将URL中的汉字进行编码后再次执行请求,得到以下结果:
服务端返回了200状态码,说明请求ok了。
参考
https://zh.wikipedia.org/wiki/Base64
https://zh.wikipedia.org/wiki/%E7%99%BE%E5%88%86%E5%8F%B7%E7%BC%96%E7%A0%81