专栏首页北京马哥教育Python3 加密解密技术详解

Python3 加密解密技术详解

引言

Python 3 的标准库中没多少用来解决加密的,不过却有用于处理哈希的库。

在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto 和 cryptography 上。

我们将学习如何使用这两个库,来加密和解密字符串

哈希

1.哈希简介

使用标准库中的 hashlib 模块可以用来处理安全哈希算法或者消息摘要算法。

这个模块包含了符合 FIPS(美国联邦信息处理标准)的安全哈希算法,例如 SHA1,SHA224,SHA256,SHA384,SHA512 以及 RSA 的 MD5 算法。

当然,Python也支持 adler32 以及 crc32 哈希函数,不过它们在 zlib 模块中。

哈希的最常见的用法是,存储密码的哈希值而非密码本身。这时候使用哈希函数需要稳健一点,否则容易被破解。

另一个常见的用法是,计算一个文件的哈希值,然后将这个文件和它的哈希值分别发送。

接收到文件的人可以计算文件的哈希值,检验是否与接收到的哈希值相符——以此来检验文件是否被篡改。

2.实战示例

  • 创建一个 md5 哈希:

如图所示,我们首先导入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:

  • Linux
  • Windows

如果你遇到了问题,可能是因为你没有安装正确的依赖包(LCTT 译注:如 python-devel),或者你的 Windows 系统需要一个编译器。

DES算法学习

1.DES 算法加密示例

示例步骤如下:

  • 将密钥变量设置为 8 个字符(DES 加密使用的密钥长度为 8 个字节)
  • 创建一个函数pad,来给一个字符串末尾填充空格,直到它的长度是 8 的倍数
  • 创建一个 DES 的实例、需要加密的文本、经过填充处理的文本
  • 尝试着对未经填充处理的文本进行加密,显示ValueError错误
  • 过填充处理的文本进行加密,得到加密的字符串

2.DES解密示例

解密非常容易,调用des对象的decrypt方法就可以得到原来的byte类型字符串了。

下一个任务是学习如何用 RSA 算法加密和解密一个文件。

RSA算法学习

要使用 RSA 算法加密数据,必须拥有访问 RAS 公钥和私钥的权限,否则你需要生成一组自己的密钥对。

在这个例子中,我们将生成自己的密钥对。

1.在 Python 解释器中创建 RSA 密钥:

  • 从 Crypto.PublicKey 包中导入 RSA,创建一个密码
  • 生成 2048 位的 RSA 密钥
  • 调用 RSA 密钥实例的 exportKey 方法,传入密码、使用的 PKCS 标准以及加密方案这三个参数。
  • 将私钥写入磁盘的文件。
  • 使用方法链调用publickey 和 exportKey 方法生成公钥,写入磁盘上的文件。

2.加密文件

有了私钥和公钥之后,我们就可以加密一些数据,并写入文件了。

  • 导入 PyCryptodome 包
  • 打开一个文件用于写入数据
  • 导入公钥赋给一个变量,创建一个 16 字节的会话密钥。例中使用混合加密方法,即 PKCS#1 OAEP,也就是最优非对称加密填充
  • 创建 AES 加密,然后加密数据,得到加密的文本和消息认证码
  • 将随机数、消息认证码和加密的文本写入文件

这里的随机数通常是真随机或伪随机数,只是用来进行密码通信的。对于 AES 加密,其密钥长度最少是 16 个字节。

3.解密示例

  • 以二进制模式读取加密文件
  • 导入私钥。注意,导入私钥时,需要提供密码
  • 文件中读取加密的会话密钥、 16 字节的随机数、16 字节的消息认证码和其他加密数据
  • 解密出会话密钥,重新创建 AES 密钥
  • 解密出数据

接下来就是cryptography包的学习。

cryptography包

cryptography能够创建简单安全、易于使用的加密方案。如果有需要的话,你也可以使用一些底层的密码学基元。

1.安装

如果你使用的 Python 版本是 3.5, 你可以使用 pip 安装,如下:

如果安装成功,我们就可以试着加密一些文本了。

建议使用 Fernet 对称加密算法,它保证了加密信息在不知道密码的情况下不能被篡改或读取。Fernet 还通过 MultiFernet 支持密钥轮换。

2.示例

下面看一个简单的例子:

  • 导入 Fernet
  • 生成一个密钥,它是一个随机的字节串。
  • 使用这个密钥生成 Fernet 密码
  • 现在我们有了用来加密和解密消息的密码
  • 创建一个消息,然后使用 encrypt 方法对它加密
  • 输出出加密的文本
  • 调用 decrypt 方法,并传入加密的文本作为参数
  • 得到了消息字节串形式的纯文本,完成解密

小结

本文浅显地介绍了 PyCryptodome 和 cryptography 这两个包的使用,即关于如何加密解密字符串和文件的简述。

如果想要获取更多的更深度的内容,可以阅读官方文档或进行实战练习。

本文分享自微信公众号 - 马哥Linux运维(magedu-Linux),作者:PythonTAB

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-03-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何安全的存储密码

    过去一段时间来,众多的网站遭遇用户密码数据库泄露事件,这甚至包括顶级的互联网企业–NASDQ上市的商务社交网络Linkedin,国内诸如CSDN一类的就更多了。...

    小小科
  • 一个很有借鉴价值的编程故事

    这是一个真实的故事,关于我自己的。一个理智的生命个体是怎么一步步走向疯狂? 我穿着西装,坐在办公室里,脑子里有一个模糊的创业想法。然后,我决定学习编程。我曾经无...

    小小科
  • 进程运行于不同的 CPU 核

    用 Gearman 搭建 Map/Reduce ,GearmanManager 来管理所有的 workers。启动多个 gearman-manager dae...

    小小科
  • Python爬虫进阶必备 | X咕视频密码与指纹加密分析

    之后会在公众号试着写一些Python其他方向的文章和自己的一些思考,希望不会出现阅读大跌等水土不服的情况。

    咸鱼学Python
  • 中国首份00后生活形态与消费方式报告

    脑洞大开,天马行空 ? 初具自我意识,崇尚专属专享 ? 人小鬼大,独立自主 ? 与成人社会无缝对接 ? 成绩不重要,但仍上紧发条 ? 具有强烈...

    小莹莹
  • 谈谈分布式事务TCC机制

    分布式事务是几乎所有分布式微服务系统中,最棘手也是最重要的一个点了。在讲解分布式事务前,先了解下数据库事务的特性;数据库事务的几个特性:原子性(Atomicit...

    刘文正
  • 《coredump问题原理探究》windows版第四章函数的逆向

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/detai...

    血狼
  • PHP加密解密的解析

    php做为一门当下非常流行的web语言,常常看到有人求解密php文件,想当年的asp也是一样。一些人不理解为什么要混淆(加密),甚至鄙视混淆(加密),在我看来混...

    V站CEO-西顾
  • 强化学习(八)价值函数的近似表示与Deep Q-Learning

        在强化学习系列的前七篇里,我们主要讨论的都是规模比较小的强化学习问题求解算法。今天开始我们步入深度强化学习。这一篇关注于价值函数的近似表示和Deep Q...

    刘建平Pinard
  • 币聪早报:美国银行为加密货币保管系统申请专利

    美国银行已向美国专利商标局申请一个以安全方式存储和保管加密货币的专利。该文件简述一种用记录和存储,为企业设计的加密货币交易有关的数据系统。

    币聪财经

扫码关注云+社区

领取腾讯云代金券