密码学俱乐部的一条规则是:永远不要自己发明密码系统。密码学俱乐部的第二条规则是:永远不要自己实现密码系统:在现实世界中,在密码系统的实现和设计阶段都会发现许多错误。Python中一个有用的基本加密库称为密码学。它既是“安全”基础库,又是“危险”层。“危险”层需要更多的关注和知识,使用它很容易出现安全漏洞。在这篇介绍性文章中,我们不会涵盖“危险”层中的任何内容!加密库中最有用的高级安全功能是Fernet实现。Fernet是实践加密缓冲区的标准。它不适合非常大的文件,例如千兆字节以上的文件,因为它需要您一次将要加密或解密的内容加载到内存缓冲区中。Fernet支持对称(即密钥)加密*:加密和解密使用相同的密钥,因此必须保持安全。生成密钥很简单:>>>k=fernet.Fernet.generate_key()>>>type(k)这些字节可以写入具有适当权限的安全机器上的文件。一旦你有了密钥,加密也很容易:>>>frn=fernet.Fernet(k)>>>encrypted=frn.encrypt(b"xmarksthespot")>>>encrypted[:10]b'gAAAAABb1'如果在在您的机器上加密,您会看到略有不同的值。不仅因为(我希望)你生成了一个与我不同的密钥,还因为Fernet将要加密的值与一些随机生成的缓冲区连接起来。这是我前面提到的“做法”之一:它会阻止对手分辨出哪些加密值是相同的。解密同样简单:>>>frn=fernet.Fernet(k)>>>frn.decrypt(encrypted)b'xmarksthespot'请注意,这仅加密和解密字节串。为了对文本字符串进行加密和解密,通常需要使用UTF-8编码和解码。20世纪中叶密码学最有趣的发展之一是公钥密码学。它释放加密密钥,同时对解密密钥保密。例如,它可用于保存服务器使用的API密钥:服务器是有权访问解密密钥的一方,但任何人都可以持有公共加密密钥。虽然密码学没有任何支持公钥密码学的安全功能,但PyNaCl库有。PyNaCl包装并提供了一些很好的方法来使用DanielJ.Bernstein发明的NaCl加密系统。NaCl总是同时加密和签名或者同时解密和验证签名。这是一种防止基于延展性的攻击的方法,在这种攻击中,不良行为者会修改加密值。加密是用公钥完成的,而签名是用私钥完成的:>>>fromnacl.publicimportPrivateKey,PublicKey,Box>>>source=PrivateKey.generate()>>>withopen("target.pubkey","rb")asfpin:...target_public_key=PublicKey(fpin.read())>>>enc_box=Box(source,target_public_key)>>>result=enc_box.encrypt(b"xmarksthespot")>>>结果[:4]b'\xe2\x1c0\xa4'解密颠倒角色:需要私钥解密,公钥验证签名:>>>fromnacl.publicimportPrivateKey,PublicKey,Box>>>withopen("source.pubkey""rb")asfpin:...source_public_key=PublicKey(fpin.read())>>>withopen("target.private_key","rb")asfpin:...target=PrivateKey(fpin.read())>>>dec_box=Box(target,source_public_key)>>>dec_box.decrypt(result)b'xmarksthespot'PocketProtector库建立在PyNaCl之上,包括完整的密钥管理方案。