编解码
日常工作中经常会遇到一些编码解码、加密解密相关的东西,虽然不需要知道怎么做的,但是如果对这些东西完全不懂的话,对于一些原理的理解还是有困难的。这里梳理一些自己常用到的关键点和一些浅显的解释。方便需要的时候随时查阅。
密码学
密码学起源于古典密码学:
- 移位式
- 替换式
现代密码学
- 对称式加密
- 非对称式加密
对称加密:
A使用密钥和加密算法进行加密,生成密文,B拿到密文后,使用解密算法和密钥进行解密。
算法:DES、AES
非对称加密:
A和B进行通信,A使用B的公钥进行加密,生成密文,B拿到密文后使用自己的私钥进行解密,反之亦然。
在非对称加密中,也可以使用私钥进行加密,然后使用公钥进行解密,这样就可以将非对称加密用在电子签名的场景中,使得签名无法伪造。自己使用私钥生成密文,别人使用公钥进行解密,如果解密后和签名对的上,说明非伪造。
算法:RSA、DSA
RSA可用于加密、解密和签名
DSA专门用于电子签名
编解码
先来一段百度百科的解释:
编码是信息从一种形式或格式转换为另一种形式的过程也称为计算机编程语言的代码简称编码。用预先规定的方法将文字、数字或其它对象编成数码,或将信息、数据转换成规定的电脉冲信号。编码在电子计算机、电视、遥控和通讯等方面广泛使用。编码是信息从一种形式或格式转换为另一种形式的过程。解码,是编码的逆过程。
Base64
Base64把二进制数据转化为使用64个字符表示的串。
64个字符为:
- A-Z
- a-z
- 0-9
- / +
二进制数据中每6位转化为一个字符。最终生成可以用0到63编号对应的字符表示的编码后的内容。
Base64能够让原始文件具有字符串所具有的特性。但是,在进行传输时,会增加数据的长度。即:在正常传输时,传输的时字符,对应8位,但是转化为Base64时,没6位生成一个字符。数据长了1/3。
URL encoding
将URL中的保留字符使用百分号“%”进行编码。
目的时消除歧义,避免解析错误。
书写URL时要使用US-ASCII字符集可以显示的字符。如果需要在URL中使用不属于此字符集的字符,就要使用特殊的符号对该字符进行编码。如:最常使用的空格用%20来表示,例如:http://www.google.com/new%20123.html。除了那些无法显示的字符外,还需要在URL中对那些保留(reserved)字符和不安全(unsafe)字符进行编码。
压缩与解压
压缩:把数据换一种方式来存储,目的是减少存储空间。
解压缩:对压缩后的数据进行还原,便于进行使用。
常见压缩算法:DEFLATE、JPEG、MP3
Hash
把任意数据转为指定大小范围的数据。一般用于摘要、数字指纹等。
算法: MD5、SHA1、SHA256
Hash在工作中通常用于
- 数据完成性验证
- 快速查找,主要是通过对hash表的使用来进行实现,基于hashcode和hashmap。
在登录过程中,通过使用md5算法来实现密码的转化。这样可以保护用户的隐私,但是使用彩虹表(即常用密码和md5结果的映射表)可以伪造用户登录。针对这种情况,可以使用加盐的方案进行破解。不同的网站由不同的盐,加盐后的md5结果和原始的MD5结果是不一样的,因此无法通过彩虹表进行破解。
那么Hash是一种编码方式吗?答案是否。原因是,编码需要是可逆的,可以通过解码进行还原。Hash显然做不到,因此Hash不属于编码。
类似:Hash和MD5也不算是加密。原因很简单:数据经过Hash和MD5转换后,大小发生了变化,通常时变小了,这是一个不可逆的过程。因此,他们都不属于加密。
字符集
字符集就是一个整数向现实世界转化的map
- ASCII
- ISO-8859-1
- unicode
- utf-8 编码
- utf-16 编码
- GBK/GB2312/GB18030
字符集中的编码就是按照字符对文本的不同表达方式。