当时使用的对称加密库是PyCrypto,这个库应该是python密码学方面最出名的第三方库了,这里就不多介绍了,想了解的可以访问他的GitHub。现在来看看cryptography怎么使用。首先需要知道它支持python的哪些版本。其官网说支持的版本有:Python 2.7、Python 3.4+ 和 PyPy 5.3+。我这里使用的是3.6.3。安装...
python对称加密之cryptography
Cryptography这个库是从python3: 加密简介这篇文章中了解到的,该文章中提到这个库是人类易于使用的密码学包,于是我便访问了官网,对其具体使用进行了研究。
对称加密的使用方式通常是,某些数据我们不希望以明文形式存储,但又希望将来能够再次使用该明文。
过往需求:在之前做运维平台时,遇到过一个需求。master主控机有其他slave节点的root权限(ssh公钥部署的方式)。我们老大觉得这不太安全,万一主控机被黑掉,其他机器也就沦陷,不太安全。因此,在创建master私钥对儿的时候设置了私钥密码(passphrase),这样即使主控机被黑,不知道私钥密码也无法访问从节点。
设想是这样的,但是自动化平台的操作不可能每次都要求用户输入私钥密码然后再进行操作(太繁琐)。因此,就想把秘钥密码通过平台(web界面)让管理员输入(配置)并保存到数据库中。当然,数据库中不能保存密码的明文,必须经过加密。这样,程序每次进行自动操作时,就可以从数据库取出密文进行解密,从而获得私钥密码,通过paramiko库就可以操控其他服务器了。
(后来想想,其实也不太安全,万一黑客从服务器上访问了程序源码,把解密的过程摘出来,一样可以获得私钥密码)
当时使用的对称加密库是PyCrypto,这个库应该是python密码学方面最出名的第三方库了,这里就不多介绍了,想了解的可以访问他的GitHub。
现在来看看cryptography怎么使用。首先需要知道它支持python的哪些版本。其官网说支持的版本有:Python 2.7、Python 3.4+ 和 PyPy 5.3+。我这里使用的是3.6.3。安装当然是通过最方便的pip。
安装后会安装一些依赖包,这里就不多说了。
通过cryptography实现对称加密简单到令人发指(相对pycrypto)。接口只有一个Fernet类,这个类包括一个类方法:generate_key(),两个实例方法:encrypt() -- 加密,decrypt() -- 解密。
一步一步来看:[1]导入包,[2]实例化Fernet需要唯一的参数key,这个参数要求有点高,不是随便一个字节序列就行,要求32位 + url-safe + base64-encoded 的bytes类型。为了方便,Fernet类内置了生成key的类方法:generate_key(),作为加密解密的钥匙。当然,要求不能有重复的,所以,如果你多执行几次,会发现,生成出来的不会有重复的(好像说的事废话)。
[3]实例化一个Fernet对象。[4]接下来就是加密方法:fernet.encrypt(data) 接受一个bytes类型的数据,返回一个加密后的bytes类型数据(人类看不懂),俗称token-Fernet。
[5]解密fernet.decrypt(token)
实在是太简单了(如果你用过pycrypto的话)。
需要注意的是,实例化Fernet时用到的key要保存好,否则就再也解不了密文了!Keep this some place safe! If you lose it you’ll no longer be able to decrypt messages; if anyone else gains access to it, they’ll be able to decrypt all of your messages, and they’ll also be able forge arbitrary messages that will be authenticated and decrypted.
还有功能叫密钥轮换(key rotation),大概的意思是说加密一段明文的时候可以使用多个key,而这些key允许在将来进行替换。该特性需要在version2.2版本里,但是我本地使用pip进行安装却发现最高版本是2.1.4,这是什么鬼~,具体见官网文档。
先废话到这里,欢迎有相关需求的蛇友交流使用场景。2024-08-22