学而实习之 不亦乐乎

Base64 编码和 UrlEncode 编码

2023-10-02 07:53:01

实际上这两种编码格式完全是不一样的,说区别,完全是两者的使用上的区别,因为它们在实现上几乎没什么相似性,只是在使用时可能会迷糊到底应该使用那一个。关于两者的实现算法这里不多说,有兴趣可自行查找,这里只记录一下它们的使用上的区别。

一、Base64 编码

使用 Base64 编码的初衷。是为了方便把含有不可见字符串的信息用可见字符串表示出来。在计算机中任何数据都是 ASCII 码存储的,而 ASCII 码的 128~255 之间的值是不可见字符。而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。所以就先把数据先做一个 Base64 编码,统统变成可见字符,这样出错的可能性就大降低了。

1、Base64 编码的应用

Base64 编码可以实现简单的数据加密,隐藏真实数据,Base64 算法的复杂程度要小,效率相对较高。当然 Base64 编码的主要的作用不在于安全性,而在于让内容能在各个网关间无错的传输,这才是 Base64 编码的核心作用。

Base64 编码可用于在 HTTP 环境下传递较长的标识信息。例如,在 Java 持久化系统 Hibernate 中,就采用了 Base64 来将一个较长的唯一标识符(一般为 128-bit 的UUID)编码为一个字符串,用作HTTP表单和 HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。

然而,标准的 Base64 并不适合直接放在 URL 里传输,因为 URL 编码器会把标准 Base64 中的 "/" 和 "+" 字符变为形如 "%XX" 的形式,而这些 "%" 号在存入数据库时还需要再进行转换,因为 ANSI SQL 中已将 "%" 号用作通配符。

(1)为解决此问题,可采用一种用于 URL 的改进 Base64编码,它不在末尾填充 '=' 号,并将标准Base64中的 "+" 和 "/" 分别改成了 "-" 和 "",这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。

(2)另有一种用于正则表达式的改进 Base64 变种,它将 "+" 和 "/" 改成了 "!" 和 "-",因为 "+","" 以及前面在IRCu中用到的"["和"]"在正则表达式中都可能具有特殊含义。 此外还有一些变种,它们将"+/"改为"-"或"."(用作编程语言中的标识符名称)或".-"(用于XML中的Nmtoken)甚至"*:"(用于XML中的Name)。

很多下载类网站都提供"迅雷下载"的链接,其地址通常是加密的迅雷专用下载地址。   如thunder://QUFodHRwOi8vd3d3LmJhaWR1LmNvbS9pbWcvc3NsbTFfbG9nby5naWZaWg==   其实迅雷的"专用地址"也是用Base64加密的,其加密过程如下:

(1)在地址的前后分别添加AA和ZZ

如 www.baidu.com/img/sslm1_logo.gif 变成 AAwww.baidu.com/img/sslm1_logo.gifZZ

(2)对新的字符串进行Base64编码

如 AAwww.baidu.com/img/sslm1_logo.gifZZ 用 Base64 编码得到 QUFodHRwOi8vd3d3LmJhaWR1LmNvbS9pbWcvc3NsbTFfbG9nby5naWZaWg==

(3)在上面得到的字符串前加上"thunder://"就成了

thunder://QUFodHRwOi8vd3d3LmJhaWR1LmNvbS9pbWcvc3NsbTFfbG9nby5naWZaWg==

二、UrlEncode

与 Base64 编码的核心作用不同,URL 编码(UrlEncode)主要是为了解决一些 URL 中的一些特殊字符和歧义字符或者中文字符的传输问题。因此不能简单地把 Base64 当作 UrlEncode。因为 UrlEncode 对于a-z,A-Z,0-9,.,-和_ 都不会做任何处理原样输出,而其它字节会被编码为 %xx (16进制)的形式,其中 xx 就是这个字节对应的hex编码。要知道以下区别:

1、Base64 编码里面有 “+” 号,而在 UrlEncode 编码中 “+” 会被解码成空格,UrlEncode时,"+" 号肯定是由空格编码出来的,但是 Base64 编码的结果中 "+" 不是空格编码出来的,如果将 Base64 编码作为安全的 URL 编码使用,则 “+” 将被解码成空格,这是我们不愿看到的; 所以不要 Base64 编码作为 URL 编码来使用.

2、http 头里面可能会用 Base64 编码来传输一些信息,因为这些信息不会被 web 服务器默认做 url 解码的,我们可以得到原始的编码信息,所以 http 头里面使用 Base64编码是可以接受的。

如果一定要在 URL 中使用 Base64 编码,可在 Base64 编码后再进行 URL编码,这样再传输可能会避免此类问题。