你好,我是王昊天。
进入了加密失败这个大篇章,我们的第一个话题就是——弱编码。
如果你想了解什么是编码,那么不妨想象一下双十一购物的场景吧。
我们通过电商平台购买了许多零食、家居用品以及二次元手办,一时下单一时爽,一直下单一直爽,于是全国人民都在买买买。这个时候电商平台的难题来了,各式各样的商品要如何送到每个人手里呢?总不能每一种商品打造一条运输线路。
于是快递出现了,通过对不同类型的商品进行方形硬纸盒的封装,既保护了商品在运输中的完整性,又保证了传输的便捷性。
这就是编码的典型场景,在服务端与客户端传输数据的过程中,我们无法确认传输的内容中是否包含传输协议不支持的内容,因此在数据传输之前我们希望通过编码的方式将传输数据进行规范化。
这里一定要注意,编码是不具备保密性的。就像快递小哥只是不想知道包装里面是什么东西,如果他想知道的话,应该是一件不难事。
编码
我们来看看维基百科是如何定义编码的:
编码是信息从一种形式或格式转换为另一种形式的过程;解码则是编码的逆过程。
作为一名优雅的开发工程师,或者是一名“大黑客”,掌握多种编码特征都是非常重要的,这一讲,我就来带你进入编码的世界遨游一番。
字符编码
字符编码是把字符集中的字符映射为指定集合中的某一个对象,以便文本在计算机中存储或者在网络之间传递。在计算机发展的早期,ASCII这样的字符集是字符编码的标准形式,但是这些字符集有着很大的局限性,比如只适用于英文场景等,于是人们开发了许多方法来扩展它们,编码的类型也逐步丰富:
- 早期标准:ASCII、EBCDIC
- 西欧标准:ISO-8859-1、ISO-8859-5、ISO-8859-6、ISO-8859-7、ISO-8859-11、ISO-8859-15等
- DOS字符集:CP437、CP737、CP850等
- Windows字符集:Windows-1250、Windows-1251、Windows-1252等
- 中文:GB2312、GBK等
- Unicode:Unicode、UTF-7、UTF-8、UTF-16、UTF-32等
这些字符集有各自的诞生意义和应用场景,在我们日常工作中会经常遇到其中的某一些,这里我们选取几个有代表性的字符集来深入研究:
ASCII ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是最常用的编码,来表示字母、数字以及常用符号。如果你正在使用Mac或者Linux类型系统,可以直接使用如下命令来查看所有的ASCII字符:
> man ascii
ASCII(7) BSD Miscellaneous Information Manual ASCII(7)
NAME
ascii -- octal, hexadecimal and decimal ASCII character sets
DESCRIPTION
The octal set:
000 nul 001 soh 002 stx 003 etx 004 eot 005 enq 006 ack 007 bel
010 bs 011 ht 012 nl 013 vt 014 np 015 cr 016 so 017 si
020 dle 021 dc1 022 dc2 023 dc3 024 dc4 025 nak 026 syn 027 etb
030 can 031 em 032 sub 033 esc 034 fs 035 gs 036 rs 037 us
040 sp 041 ! 042 " 043 # 044 $ 045 % 046 & 047 '
050 ( 051 ) 052 * 053 + 054 , 055 - 056 .