Base64 编码
简述
Base64 是一种用 64 个字符来表示任意二进制数据的方法.
Base64 编码可以成为密码学的基石. 可以将任意的二进制数据进行 Base64 编码. 所有的数据都能被编码为并只用 65 个字符就能表示的文本文件.( 65 字符: A~Z a~z 0~9 + / = )编码后的数据~= 编码前数据的 4/3, 会大 1/3 左右.
Base64 编码的原理
[图片上传失败...(image-456e10-1542450907355)]
将所有字符转化为 ASCII 码.
将 ASCII 码转化为 8 位二进制 .
将二进制 3 个归成一组 (不足 3 个在后边补 0) 共 24 位, 再拆分成 4 组, 每组 6 位.
统一在 6 位二进制前补两个 0 凑足 8 位.
将补 0 后的二进制转为十进制.
从 Base64 编码表获取十进制对应的 Base64 编码.
Base64 编码的说明
转换的时候, 将三个 byte 的数据, 先后放入一个 24bit 的缓冲区中, 先来的 byte 占高位.
数据不足 3byte 的话, 于缓冲区中剩下的 bit 用 0 补足. 然后, 每次取出 6 个 bit, 按照其值选择查表选择对应的字符作为编码后的输出.
不断进行, 直到全部输入数据转换完成.
如果最后剩下两个输入数据, 在编码结果后加 1 个 "=".
如果最后剩下一个输入数据, 编码结果后加 2 个 "=".
如果没有剩下任何数据, 就什么都不要加, 这样才可以保证资料还原的正确性.
Python 的 Base64 使用
Python 内置的 base64 模块可以直接进行 base64 的编解码
注意: 用于 base64 编码的, 要么是 ASCII 包含的字符, 要么是二进制数据
- In [1]: import base64
- In [2]: base64.b64encode(b'hello world')
- Out[2]: b'aGVsbG8gd29ybGQ='
- In [3]: base64.b64decode(b'aGVsbG8gd29ybGQ=')
- Out[3]: b'hello world'
- MD5(信息 - 摘要算法)
简述
message-digest algorithm 5(信息 - 摘要算法). 经常说的 "MD5 加密", 就是它→信息 - 摘要算法.
md5, 其实就是一种算法. 可以将一个字符串, 或文件, 或压缩包, 执行 md5 后, 就可以生成一个固定长度为 128bit 的串. 这个串, 基本上是唯一的.
不可逆性
每个人都有不同的指纹, 看到这个人, 可以得出他的指纹等信息, 并且唯一对应, 但你只看一个指纹, 是不可能看到或读到这个人的长相或身份等信息.
特点
压缩性: 任意长度的数据, 算出的 MD5 值长度都是固定的.
容易计算: 从原数据计算出 MD5 值很容易.
抗修改性: 对原数据进行任何改动, 哪怕只修改 1 个字节, 所得到的 MD5 值都有很大区别.
强抗碰撞: 已知原数据和其 MD5 值, 想找到一个具有相同 MD5 值的数据 (即伪造数据) 是非常困难的.
举个栗子: 世界上只有一个我, 但是但是妞却是非常非常多的, 以一个有限的我对几乎是无限的妞, 所以可能能搞定非常多 (100+) 的妞, 这个理论上的确是通的, 可是实际情况下....
Python 的 MD5 使用
由于 MD5 模块在 python3 中被移除, 在 python3 中使用 hashlib 模块进行 md5 操作
- import hashlib
- # 待加密信息
- str = '这是一个测试'
- # 创建 md5 对象
- hl = hashlib.md5()
- # 此处必须声明 encode
- # 若写法为 hl.update(str) 报错为: Unicode-objects must be encoded before hashing
- hl.update(str.encode(encoding='utf-8'))
- print('MD5 加密前为 :' + str)
- print('MD5 加密后为 :' + hl.hexdigest())
运行结果
MD5 加密前为 : 这是一个测试
MD5 加密后为 :cfca700b9e09cf664f3ae80733274d9f
MD5 长度
md5 的长度, 默认为 128bit, 也就是 128 个 0 和 1 的二进制串. 这样表达是很不友好的. 所以将二进制转成了 16 进制, 每 4 个 bit 表示一个 16 进制, 所以 128/4 = 32 换成 16 进制表示后, 为 32 位了.
为什么网上还有 md5 是 16 位的呢?
其实 16 位的长度, 是从 32 位 md5 值来的. 是将 32 位 md5 去掉前八位, 去掉后八位得到的.
来源: http://www.jianshu.com/p/2a39b9617211