Python密码库Cryptography探究学习

一、简介

Cryptography的目标是建立一个标准Python加密库,支持 Python 2.6-2.7, Python 3.3+, and PyPy 2.6+。如果对密码学领域感兴趣的话,可以学习Crypto 101(作者是 Laurens Van Houtven),链接为Crypto 101,这本教材很不错,适合初学者学习。

1.1 为什么建立一个新的Python密码库?

现有的Python密码库,如M2Crypto, PyCrypto, or PyOpenSSL,存在一些问题:

  • 缺少PyPy和Python 3支持
  • 缺少维护
  • 使用了差评的算法实现(例如旁路攻击side-channel attacks)
  • 缺少高级(易于使用)的APIs
  • 缺少AES-GCM和HKDF等算法
  • 经不住测试
  • 错误百出的APIs

1.2 特性

Cyptography密码库包括两个部分:cryptographic recipes and primitives.这是本密码库非常有意思的地方,很多现有的其他密码库并没有这个特点。cryptographic recipes,直接翻译为密码学菜谱。其实个人也一时找不出合适的词语来解释。cryptographic primitives,即为密码学原语,也就是基本的密码概念,如加密、签名、Hash等算法。但是直接使用密码学原语容易出错,在实际应用中无法保证安全性。基于这一点,该库对密码学原语进行了安全集成,形成了更高层次的“密码学菜谱”。这么说吧,密码学原语像是做菜的原材料,对于初学者来说,虽然手里都有,但是不懂得如何去制作;如果有了“密码学菜谱”,初学者直接按照说明,制作菜肴就可以了。

看看原文中,作者怎么说吧:

One with safe cryptographic recipes, “cryptography for humans” if you will. These are safe and easy to use and don’t require developers to make many decisions.
 

The other level is low-level cryptographic primitives. These are often dangerous and can be used incorrectly. They require making decisions and having an in-depth knowledge of the cryptographic concepts at work. Because of the potential danger in working at this level, this is referred to as the “hazardous materials” or “hazmat” layer. These live in the cryptography.hazmat package, and their documentation will always contain an admonition at the top.We recommend using the recipes layer whenever possible, and falling back to the hazmat layer only when necessary.

1.3 安装

使用Pip可以直接安装,即

$ pip install cryptography

当然使用anaconda也可以安装。

二、例子

Cryptography密码库实现了一个集成的对称密码函数,称之为Fernet。它可以保证信息无法被篡改和破解。

2.1 一个加解密的例子

>>>from cryptography.fernet import Fernet

>>>key = Fernet.generate_key()

>>>key

Out[3]: 'x10qxCPeNGhddcP5fASy5XB1JedmwXJeAF1gS-zeuvw='

>>>f = Fernet(key)

>>>f

Out[6]: 

>>>token = f.encrypt(b"my deep dark secret")

>>>token

Out[8]: 'gAAAAABYnKtVmGpMe6rM39jzSYFTlBxjXBwbCix8nZ2DBzsFh6BVzwtrYx0qDyohXQ3xqj232_DJsdN8bR9sMUQbEcPenZD-MAWqR-YkOdg7prc9e0QnMA4='

>>>f.decrypt(token)

Out[9]: 'my deep dark secret'

解释:

from cryptography.fernet import Fernet
该句为从函数库中导入Fernet。
key = Fernet .generate_key()
产生加密所需的密钥key,它通过调用相关函数而产生随机数。这个随机数是不是满足密码安全呢?我们下节进行详细的解读。
f = Fernet(key)。实例化Fernet
token = f .encrypt(b"my deep dark secret"),加密消息
f.decrypt(token),解密消息

2.2 密钥轮换(Key rotation)的例子

MultiFernet的输入为多个key的列表,它总是以第一个密钥加密消息,而在解密时,依次使用每个密钥。

Key rotation机制使得替代旧的密钥变得容易。个人可以将新的密钥添加在key列表的第一个,开始加密新的消息,而在解密以前的密文后,如果旧的密钥不再需要则丢弃。

>>>from cryptography.fernet import Fernet, MultiFernet

>>>key1 = Fernet(Fernet.generate_key())

>>>key2 = Fernet(Fernet.generate_key())

>>>f = MultiFernet([key1, key2])

>>>token = f.encrypt(b"Secret message!")

>>>token
Out[6]: 'gAAAAABYnKzqNxRAbwP6hMMGmB4eIBhiAR2oVG136Dpive8AhNBdtjwKKiOj_Zaxv8e1dHWp1_WpvktTCT5lRnm9ZnBIK4AoMw=='

>>>f.decrypt(token)
Out[7]: 'Secret message!'

>>>key3 = Fernet(Fernet.generate_key())

>>>f = MultiFernet([key3,key1, key2])

>>>f.decrypt(token)
Out[10]: 'Secret message!'

三、小结

简要介绍了Cryptography密码库,最有意思的特性是包含的两个部分cryptographic recipes 和 cryptographic primitives。

以Fernet(对称加密)为例,介绍了cryptographic recipes的使用。

下一节将对Fernet的代码进行分析,解释为什么它被称之为cryptographic recipes,而不是cryptographic primitives

你可能感兴趣的:(python,学习,开发语言)