引言
Python 3 的标准库中没多少用来解决加密的,不过却有用于处理哈希的库。
在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto 和 cryptography 上。
我们将学习如何使用这两个库,来加密和解密字符串
哈希
1.哈希简介
使用标准库中的 hashlib 模块可以用来处理安全哈希算法或者消息摘要算法。
这个模块包含了符合 FIPS(美国联邦信息处理标准)的安全哈希算法,例如 SHA1,SHA224,SHA256,SHA384,SHA512 以及 RSA 的 MD5 算法。
当然,Python也支持 adler32 以及 crc32 哈希函数,不过它们在 zlib 模块中。
哈希的最常见的用法是,存储密码的哈希值而非密码本身。这时候使用哈希函数需要稳健一点,否则容易被破解。
另一个常见的用法是,计算一个文件的哈希值,然后将这个文件和它的哈希值分别发送。
接收到文件的人可以计算文件的哈希值,检验是否与接收到的哈希值相符——以此来检验文件是否被篡改。
2.实战示例
如图所示,我们首先导入hashilb,然后创建一个md5哈希对象的实例。
随后,在示例中添加一个字符串,出现了报错信息。
这是因为计算md5哈希时,必须是用字节形式字符串,正确添加后就可以调用digest函数来得到哈希值了。
十六进制哈希值可以用以下方法获取:
下面我们看一下用这种方法创建一个 sha1 哈希:
可以看到,我们可以同时创建一个哈希实例并且调用其 digest 函数。
然后,我们可以输出这个哈希值看一下。
密钥导出
Python 的标准库对密钥导出支持较弱:hashlib 函数库提供的唯一方法就是 pbkdf2_hmac 函数。
它是 PKCS#5的基于口令的第二个密钥导出函数,并使用 HMAC 作为伪随机函数。
由于它支持“加盐salt”和迭代操作,你可以使用类似的方法来哈希你的密码。
例如,如果你打算使用 SHA-256 加密方法,你将需要至少 16 个字节的“盐”,以及最少 100000 次的迭代操作。
简单来说,“盐”就是随机的数据,被用来加入到哈希的过程中,以加大破解的难度。
这基本可以保护你的密码免受字典和彩虹表rainbow table的攻击。
这里,我们用 SHA256 对一个密码进行哈希,使用了一个糟糕的“盐”,但经过了 100000 次迭代操作。
SHA 实际上并不被推荐用来创建密码的密钥,你应该使用类似scrypt的算法或者使用一个叫 bcrypt 的专门用来哈希密码第三方库。
PyCryptodome
原本是项目分支PyCrytodome 取代了Python中密码学方面最有名的软件包 PyCrypto 。
使用以下命令进行安装PyCrytodome:
如果你遇到了问题,可能是因为你没有安装正确的依赖包(LCTT 译注:如 python-devel),或者你的 Windows 系统需要一个编译器。
DES算法学习
1.DES 算法加密示例
示例步骤如下:
2.DES解密示例
解密非常容易,调用des对象的decrypt方法就可以得到原来的byte类型字符串了。
下一个任务是学习如何用 RSA 算法加密和解密一个文件。
RSA算法学习
要使用 RSA 算法加密数据,必须拥有访问 RAS 公钥和私钥的权限,否则你需要生成一组自己的密钥对。
在这个例子中,我们将生成自己的密钥对。
1.在 Python 解释器中创建 RSA 密钥:
2.加密文件
有了私钥和公钥之后,我们就可以加密一些数据,并写入文件了。
这里的随机数通常是真随机或伪随机数,只是用来进行密码通信的。对于 AES 加密,其密钥长度最少是 16 个字节。
3.解密示例
接下来就是cryptography包的学习。
cryptography包
cryptography能够创建简单安全、易于使用的加密方案。如果有需要的话,你也可以使用一些底层的密码学基元。
1.安装
如果你使用的 Python 版本是 3.5, 你可以使用 pip 安装,如下:
如果安装成功,我们就可以试着加密一些文本了。
建议使用 Fernet 对称加密算法,它保证了加密信息在不知道密码的情况下不能被篡改或读取。Fernet 还通过 MultiFernet 支持密钥轮换。
2.示例
下面看一个简单的例子:
小结
本文浅显地介绍了 PyCryptodome 和 cryptography 这两个包的使用,即关于如何加密解密字符串和文件的简述。
如果想要获取更多的更深度的内容,可以阅读官方文档或进行实战练习。