[TOC]
## 加密算法介绍
### HASH
Hash,一般叫“散列”或”哈希”,就是把任意长度的输入通过散列算法,变换成固定长度的输出,该输出就是散列值
### MD5
**MD5功能**
输入任意长度的信息,经过处理,输出为128位的信息(数字指纹);
不同的输入得到的不同的结果(唯一性);
在计算过程中原文的部分信息是丢失了的,因此数据不可逆
**MD5算法的特点**
1. 压缩性:任意长度的数据,算出的MD5值的长度都是固定的
2. 容易计算:从原数据计算出MD5值很容易
3. 抗修改性:对原数据进行任何改动,修改一个字节生成的MD5值区别也会很大
4. 强抗碰撞:已知原数据和MD5,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
**MD5用途**
1. 防止被篡改:
2. 防止直接看到明文:
3. 防止抵赖(数字签名):
### SHA-1
安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。
目前最流行的是加密算法是SHA-256
### MD5与SHA-1的比较
SHA-1与MD5的最大区别在于其摘要比MD5摘要长32 比特。。但由于SHA-1的循环步骤比MD5多80:64且要处理的缓存大160比特:128比特,SHA-1的运行速度比MD5慢。
## Python的hashlib模块
python 3.x里的hashlib模块代替了2.x里的md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
hashlib 加密的字符串类型为二进制编码,直接加密字符串会报错误,需要用encode转码
### 普通加密演示
```
import hashlib
str='my name is luo gang'
# ######## md5 ########
>>> md=hashlib.md5()
>>> md.update(str.encode('utf-8')) #注意转码
>>> md.hexdigest()
'fc732987e2f36bc2406fae8205f08264'
# ######## sha1 ########
>>> md=hashlib.sha1()
>>> md.update(str.encode('utf-8'))
>>> md.hexdigest()
'f14d332e0c9509945bc12e868ec6dcb842aed8e3'
# ######## sha256 ########
>>> md=hashlib.sha256()
>>> md.update(str.encode('utf-8'))
>>> md.hexdigest()
'da2d566a8fc9f3473241ca9a7fac5f7afab41a0f5eda66c9ff7e1b25ab3bb382'
```
### 高级加密
以上加密算法虽然依然非常厉害,但如果被加密内容简单,可以通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密
```
>>> md=hashlib.md5('def'.encode('utf-8'))
>>> md.update(str.encode('utf-8'))
>>> md.hexdigest()
'73e8e6e5a37e001148942b55dd57a507'
```
### 注意事项
update(arg) 更新哈希对象有大坑,如果同一个hash对象重复调用该方法,则m.update(a); m.update(b) 等效于 m.update(a+b),并不是替换原数据,切记.
- 基础部分
- 基础知识
- 变量
- 数据类型
- 数字与布尔详解
- 列表详解list
- 字符串详解str
- 元组详解tup
- 字典详解dict
- 集合详解set
- 运算符
- 流程控制与循环
- 字符编码
- 编的小程序
- 三级菜单
- 斐波那契数列
- 汉诺塔
- 文件操作
- 函数相关
- 函数基础知识
- 函数进阶知识
- lambda与map-filter-reduce
- 装饰器知识
- 生成器和迭代器
- 琢磨的小技巧
- 通过operator函数将字符串转换回运算符
- 目录规范
- 异常处理
- 常用模块
- 模块和包相关概念
- 绝对导入&相对导入
- pip使用第三方源
- time&datetime模块
- random随机数模块
- os 系统交互模块
- sys系统模块
- shutil复制&打包模块
- json&pickle&shelve模块
- xml序列化模块
- configparser配置模块
- hashlib哈希模块
- subprocess命令模块
- 日志logging模块基础
- 日志logging模块进阶
- 日志重复输出问题
- re正则表达式模块
- struct字节处理模块
- abc抽象类与多态模块
- requests与urllib网络访问模块
- 参数控制模块1-optparse-过时
- 参数控制模块2-argparse
- pymysql数据库模块
- requests网络请求模块
- 面向对象
- 面向对象相关概念
- 类与对象基础操作
- 继承-派生和组合
- 抽象类与接口
- 多态与鸭子类型
- 封装-隐藏与扩展性
- 绑定方法与非绑定方法
- 反射-字符串映射属性
- 类相关内置方法
- 元类自定义及单例模式
- 面向对象的软件开发
- 网络-并发编程
- 网络编程SOCKET
- socket简介和入门
- socket代码实例
- 粘包及粘包解决办法
- 基于UDP协议的socket
- 文件传输程序实战
- socketserver并发模块
- 多进程multiprocessing模块
- 进程理论知识
- 多进程与守护进程
- 锁-信号量-事件
- 队列与生产消费模型
- 进程池Pool
- 多线程threading模块
- 进程理论和GIL锁
- 死锁与递归锁
- 多线程与守护线程
- 定时器-条件-队列
- 线程池与进程池(新方法)
- 协程与IO模型
- 协程理论知识
- gevent与greenlet模块
- 5种网络IO模型
- 非阻塞与多路复用IO实现
- 带着目标学python
- Pycharm基本使用
- 爬虫
- 案例-爬mzitu美女
- 案例-爬小说
- beautifulsoup解析模块
- etree中的xpath解析模块
- 反爬对抗-普通验证码
- 反爬对抗-session登录
- 反爬对抗-代理池
- 爬虫技巧-线程池
- 爬虫对抗-图片懒加载
- selenium浏览器模拟