cryptography简介
cryptography模块主要分为两类,一类是高层次的加密配方,也就是我们只用关心如何使用它提供的api,并不用关心具体加密过程等细节,这也是我们经常使用的。另一类是低层次的加密原语,如果对密码学不是很了解的话,使用加密原语构造自己的加密算法是很危险的。本片文章介绍高层次的对称加密api和低层次非对称的公钥私钥以及证书
cryptography使用
Fernet(对称加密)
|
|
Using passwords with Fernet
|
|
为了以后根据password
得到token
,需要保存好salt
X.509(数字证书标准)
数字证书是CA机构签名的含有服务器公钥以及其他网站相关信息的一种电子证书,用来说明该服务器(网站)确实是真的(官方的),而不是伪造的
这里主要使用的是非对称加密,也就是公钥和私钥(RSA),私钥用来签名,公钥用来验签
Creating a Certificate Signing Request (CSR)
When obtaining a certificate from a certificate authority (CA), the usual flow is:
- You generate a private/public key pair.
- You create a request for a certificate, which is signed by your key (to prove that you own that key).
- You give your CSR to a CA (but not the private key).
- The CA validates that you own the resource (e.g. domain) you want a certificate for.
- The CA gives you a certificate, signed by them, which identifies your public key, and the resource you are authenticated for.
- You configure your server to use that certificate, combined with your private key, to server traffic.
所以首先要生成密钥对:
|
|
关于生成certificate signing request,请看官方文档,然后就可以将生成的证书发送给CA机构,待CA机构处理完,就会返回给你经过他们签名的数字证书,该数字证书也是用户用来核实我们网站的证书。
RSA 常用操作
生成
|
|
这样就生成了一个RSAPrivateKey
对象。参数保持上面就可以了,具体参数解析看官方文档
私钥公钥是成对生成的,所以当我们使用generate_private_key
生成RSAPrivateKey
对象时,我们可以通过生成的对象获取到RSAPublicKey
对象
|
|
当然,肯定是不可以从RSAPublicKey
对象中获取到RSAPrivateKey
对象的。
从pem文件导入
也可以从一个pem格式的文件导入一个RSAPrivateKey
对象
pem格式文件就是类似:
|
|
A PEM block which starts with -----BEGIN CERTIFICATE-----
is not a public or private key, it’s anX.509 Certificate. You can load it using load_pem_x509_certificate()
and extract the public key with Certificate.public_key
当然这个文件也可以被加密,我们使用如下方法从pem文件中导入RSAPrivateKey
对象
|
|
同理也可以从cer文件和ssh格式文件中导入私钥或公钥。
序列化
RSAPrivateKey
对象和RSAPublicKey
对象都可以序列化为pem文件
|
|
强烈建议对私钥进行序列化的时候用自己的密钥进行加密,这样不会将私钥完全暴露
我们之所以说上述过程是序列化,而不是保存私钥,是因为该pem文件不止包含私钥,还包括一些有关私钥的重要信息,具体pem格式请查阅相关文档。而且实际上用的时候并不需要我们手动对pem文件进行解析,只用使用库提供的api就行
也可以不加密,改变如下
|
|
对于公钥的序列化,如下:
|
|
签名
使用私钥可以对一段信息进行签名,然后别人就可以使用公钥进行验证。
|
|
padding
也就是填充,就是将不够长度的信息填充成指定长度(这里为256),具体为什么需要填充请参考SHA256算法实现
也可以使用更简单的方法进行签名:
|
|
验证
|
|
如果验证不通过,将会触发异常,同样,也有以下简单的方式进行验证:
|
|
加密
使用私钥对信息加密没有意义,因为全世界都有你的公钥,毕竟公钥是公开的,当然,如果你不公开你的公钥,那更失去了意义,所以加密指的是用公钥进行加密,然后我们使用私钥来解密
|
|
解密
|
|
可以看到目前对公钥私钥的操作很多都是使用固定参数就完全够了,所以可以对此进一步封装,于是就出现了该项目