12:字符串加密、解密

Python011

12:字符串加密、解密,第1张

编码: 将计算机中的字符串按照一定的顺序表示成二进制数据的过程

各国字符编码都不一样:

1、计算机->表示[英文字母、数字、部分特殊符号]-> ascii编码 [0~256]

2、万国码,统一字符编码[号称可以统一全球范围内任何语言的表示方式]

任何语言中的任何数据,都可以使用一个字符来表示 unicode编码

3、中国有GB2312->GBK ->GB18030

4、数据传输编码:unicode transfer format 8 bit [UTF-8]

python中的编码解码:

要命的规则:字符串的编码解码,一直都是任何语言中一个难点和重点

任何字符串->都是由字节组成的!

python3中:字符:(str);字节(bytes)

字符->字节:encode 编码:将一个字符串编码成计算机可以操作的二进制数据

字节->字符:decode 解码:将一个二进制数据按照指定的编码~解码成自然数据

什么是加密: 将一个明文数据,按照指定的算法,运算得到一个其他的可以隐藏真实信息的密文数据,这个过程称为加密;处理的算法称为加密算法;用到的关键数据称为密钥

什么是解密: 按照指定的算法和关键数据,将一个密文数据进行逆向运算得到正确的明文数据的过程成为解密操作

(1)、单向加密算法:只能加密,不能解密的算法

如:用户账号密码(单向加密)存储,此时任何人都不能查看该用户的明文密码

流程->用户输入明文密码->加密->和存储的密文密码进行比较->相等-成功

单向散列加密算法->MD5加密

单项哈希加密算法->SHAX加密

(2)、双向加密算法:可以加密,加密的数据可以解密得到明文数据

使用在更多的场景;数据进行加密传输->目标地址->解密得到明文数据进行处理

对称加密:加密和解密使用相同的秘钥;

非对称加密:加密和解密使用不同的秘钥;如HTTPS传输数据

hashlib主要提供字符加密功能,将md5和sha模块整合到了一起,支持md5,sha1, sha224, sha256, sha384, sha512等算法

注意: hashlib 加密啊的字符串类型为二进制编码,直接加密字符串会报如下错误:

有两种方式可以将字符串转化为二进制数据

哈希

如果需要用到安全哈希算法或是消息摘要算法,那么你可以使用标准库中的 hashlib 模块。这个模块包含了符合 FIPS(美国联邦信息处理标准)的安全哈希算法,包括 SHA1,SHA224,SHA256,SHA384,SHA512 以及 RSA 的 MD5 算法。Python 也支持 adler32 以及 crc32 哈希函数,不过它们在 zlib 模块中。

哈希的一个最常见的用法是,存储密码的哈希值而非密码本身。当然了,使用的哈希函数需要稳健一点,否则容易被破解。另一个常见的用法是,计算一个文件的哈希值,然后将这个文件和它的哈希值分别发送。接收到文件的人可以计算文件的哈希值,检验是否与接受到的哈希值相符。如果两者相符,就说明文件在传送的过程中未经篡改。

让我们试着创建一个 md5 哈希:

>>>import hashlib >>>md5 = hashlib.md5() >>>md5.update('Python rocks!') Traceback (most recent call last): File "<pyshell#5>", line 1, in <module>md5.update('Python rocks!') TypeError: Unicode-objects must be encoded before hashing >>>md5.update(b'Python rocks!') >>>md5.digest() b'\x14\x82\xec\x1b#d\xf6N}\x16*+[\x16\xf4w'

让我们花点时间一行一行来讲解。首先,我们导入 hashlib ,然后创建一个 md5 哈希对象的实例。接着,我们向这个实例中添加一个字符串后,却得到了报错信息。原来,计算 md5 哈希时,需要使用字节形式的字符串而非普通字符串。正确添加字符串后,我们调用它的 digest 函数来得到哈希值。如果你想要十六进制的哈希值,也可以用以下方法:

>>>md5.hexdigest() '1482ec1b2364f64e7d162a2b5b16f477'

实际上,有一种精简的方法来创建哈希,下面我们看一下用这种方法创建一个 sha1 哈希:

>>>sha = hashlib.sha1(b'Hello Python').hexdigest() >>>sha '422fbfbc67fe17c86642c5eaaa48f8b670cbed1b'

可以看到,我们可以同时创建一个哈希实例并且调用其 digest 函数。然后,我们打印出这个哈希值看一下。这里我使用 sha1 哈希函数作为例子,但它不是特别安全,读者可以随意尝试其他的哈希函数。

密钥导出

Python 的标准库对密钥导出支持较弱。实际上,hashlib 函数库提供的唯一方法就是 pbkdf2_hmac 函数。它是 PKCS#5 的基于口令的第二个密钥导出函数,并使用 HMAC 作为伪随机函数。因为它支持“加盐(salt)”和迭代操作,你可以使用类似的方法来哈希你的密码。例如,如果你打算使用 SHA-256 加密方法,你将需要至少 16 个字节的“盐”,以及最少 100000 次的迭代操作。

简单来说,“盐”就是随机的数据,被用来加入到哈希的过程中,以加大破解的难度。这基本可以保护你的密码免受字典和彩虹表(rainbow table)的攻击。

让我们看一个简单的例子:

>>>import binascii >>>dk = hashlib.pbkdf2_hmac(hash_name='sha256', password=b'bad_password34', salt=b'bad_salt', iterations=100000) >>>binascii.hexlify(dk) b'6e97bad21f6200f9087036a71e7ca9fa01a59e1d697f7e0284cd7f9b897d7c02'

这里,我们用 SHA256 对一个密码进行哈希,使用了一个糟糕的盐,但经过了 100000 次迭代操作。当然,SHA 实际上并不被推荐用来创建密码的密钥。你应该使用类似 scrypt 的算法来替代。另一个不错的选择是使用一个叫 bcrypt 的第三方库,它是被专门设计出来哈希密码的。

我也来几个吧

standard libs:

itertools http://docs.python.org/2/library/itertools.html

functools http://docs.python.org/2/library/functools.html 学好python有必要掌握上面这两个库吧,

re 正则

subprocess http://docs.python.org/2/library/subprocess.html 调用shell命令的神器

pdb 调试

traceback 调试

pprint 漂亮的输出

logging 日志

threading和multiprocessing 多线程

urllib/urllib2/httplib http库,httplib底层一点,推荐第三方的库requests

os/sys 系统,环境相关

Queue 队列

pickle/cPickle 序列化工具

hashlib md5, sha等hash算法

cvs

json/simplejson python的json库,据so上的讨论和benchmark,simplejson的性能要高于json

timeit 计算代码运行的时间等等

cProfile python性能测量模块

glob 类似与listfile,可以用来查找文件

atexit 有一个注册函数,可用于正好在脚本退出运行前执行一些代码

dis python 反汇编,当对某条语句不理解原理时,可以用dis.dis 函数来查看代码对应的python 解释器指令等等。

3th libs:

paramiko https://github.com/paramiko/paramiko ssh python 库

selenium https://pypi.python.org/pypi/selenium 浏览器自动化测试工具selenium的python 接口

lxml http://lxml.de/ python 解析html,xml 的神器

mechanize https://pypi.python.org/pypi/mechanize/ Stateful programmatic web browsing

pycurl https://pypi.python.org/pypi/pycurl cURL library module for Python

Fabric http://docs.fabfile.org/en/1.8/ Fabric is a Python (2.5 or higher) library and command-line tool for streamlining the use of SSH for application deployment or systems administration tasks.

xmltodict https://github.com/martinblech/xmltodict xml 转 dict,真心好用

urllib3 和 requests: 当然其实requests就够了 Requests: HTTP for Humans

flask http://flask.pocoo.org/python web 微框架

ipdb 调试神器,同时推荐ipython!结合ipython使用

redis redis python接口

pymongo mongodbpython接口

PIL http://www.pythonware.com/products/pil/ python图像处理

mako http://www.makotemplates.org/ python模版引擎

numpy , scipy 科学计算

matplotlib 画图

scrapy 爬虫

django/tornado/web.py/web2py/uliweb/flask/twisted/bottle/cherrypy.等等 python web框架/服务器

sh 1.08 — sh v1.08 documentation 用来运行shell 模块的 极佳选择