1. 转义算法
转义算法可以把一个字符转换为另一个(组)字符。
转义算法有以下几个特点:
- 算法和字符映射表是公开的
- 转换操作是可逆的
- 转换后的数据长度和原文长度正相关。
常见的转义算法有urlencode、base64。
其中urlencode主要对url编码以解决url请求参数中的中文字符、特殊字符等的传递操作。而base64的应用比较广泛,这种算法可以将任意形式的数据转换为仅由64个字符组成的数据串。
有很多在线工具可以做编码解码操作,比如可以在这里做urlencode操作,效果如下:
需要注意的是,这里是对整个文本内容进行了encode,所以内容中的:// 都被编码了,在实际使用时要按需进行转换。
base64也有线上工具,比如这里,效果如下:
2. 摘要算法
摘要算法能把一组任意长度的数据映射到一个固定长度的数据上。
摘要算法有以下特点:
- 算法是公开的
- 转换操作是不可逆的
- 转换后的数据长度和原文长度无关
- 摘要结果通常以16进制的形式表现
常见的摘要算法有MD5、SHA-1、SHA-256等。
摘要算法主要用于文件内容校验,比如网站提供一个较大文件同时附上其MD5值(或其他摘要算法值),用户在下载完成后只需要对比一下本地文件的MD5值和网站上提供的是否一致,就可以知道下载的问题是否有损坏了。
比如下面这样的
Android Studio的下载页面,提供了文件下载地址和用于校验的SHA-256信息
值得注意的是,因为摘要长度是有限的,所以理论上会出现两个数据的摘要结果相同的情况。比如MD5的长度是32位16进制,总数也就是2128个,那么如果有2128+1个文件求MD5,那么必然有两个文件的结果是一样的。不过由于这个数据实在是太大了,所以可以忽略。
2004年,有人破解了MD5(论文在这里),但实际上他并不是通过MD5结果计算出了原文,而是通过某种算法组合出了一组数据,令其MD5结果和目标一致。
3. 加密算法
加密算法就是通过某种手段将原文转换为密文。正常情况下,没有秘钥是无法将密文还原成原文的。
加密算法有以下几个特点:
- 算法可以是公开的
- 算法要和秘钥配合使用,而秘钥不是公开的
- 转换操作是可逆的,但是必须使用秘钥
- 转换后的长度和原文长度正相关
加密算法又分为对称加密和非对称加密,区别在于对称加密中加密和解密的秘钥是同一个,而非对称加密中加密和解密的秘钥是不同的。
常见的对称加密算法有AES、DES,非对称加密算法有RSA、DSA等。
非对称加密只能加密固定长度的数据且算法效率低(相对对称加密而言),一般用于签名校验和秘钥(用于对称加密)传递的场景。
4. 签名和验签
签名不是一种算法,但是他用到了上面提到的摘要算法和非对称加密算法。
签名的意义在于告诉接收者数据确实是我的而不是别人伪造的。(含义类似于消费时在刷卡单上签名。) 比如Google发布了一款App并对App进行了签名,当用户设备上下载了该App后,通过验签操作就可以确认这个App确实是Google发布的。
下面我们看一下签名和验签操作是如何进行的。
首先对原文做摘要计算,然后使用非对称加密的私钥进行加密。
然后当客户拿到数据后,先对原文做摘要,并对密文进行解密(解密秘钥是公钥,任何人都能获得),然后对比二者是否一致,如果一致则可以确认信息的来源。
验签过程
网友评论