Python玩转加密的技巧【推荐】

作者:佚名 时间:2023-06-26 07:01:31 

密码学俱乐部的第一条规则是:永远不要自己发明密码系统。密码学俱乐部的第二条规则是:永远不要自己实现密码系统:在现实世界中,在实现以及设计密码系统阶段都找到过许多漏洞。

Python 中的一个有用的基本加密库就叫做 cryptography 。它既是一个“安全”方面的基础库,也是一个“危险”层。“危险”层需要更加小心和相关的知识,并且使用它很容易出现安全漏洞。在这篇介绍性文章中,我们不会涵盖“危险”层中的任何内容!

cryptography 库中最有用的高级安全功能是一种 Fernet 实现。Fernet 是一种遵循最佳实践的加密缓冲区的标准。它不适用于非常大的文件,如千兆字节以上的文件,因为它要求你一次加载要加密或解密的内容到内存缓冲区中。

Fernet 支持 对称(symmetric)(即 密钥(secret key))加密方式*:加密和解密使用相同的密钥,因此必须保持安全。

生成密钥很简单:


>>> k = fernet.Fernet.generate_key()
>>> type(k)
<class 'bytes'>

这些字节可以写入有适当权限的文件,最好是在安全的机器上。

有了密钥后,加密也很容易:


>>> frn = fernet.Fernet(k)
>>> encrypted = frn.encrypt(b"x marks the spot")
>>> encrypted[:10]
b'gAAAAABb1'

如果在你的机器上加密,你会看到略微不同的值。不仅因为(我希望)你生成了和我不同的密钥,而且因为 Fernet 将要加密的值与一些随机生成的缓冲区连接起来。这是我之前提到的“最佳实践”之一:它将阻止对手分辨哪些加密值是相同的,这有时是攻击的重要部分。

解密同样简单:


>>> frn = fernet.Fernet(k)
>>> frn.decrypt(encrypted)
b'x marks the spot'

请注意,这仅加密和解密字节串。为了加密和解密文本串,通常需要对它们使用 UTF-8 进行编码和解码。

20 世纪中期密码学最有趣的进展之一是 公钥(public key)加密。它可以在发布加密密钥的同时而让解密密钥保持保密。例如,它可用于保存服务器使用的 API 密钥:服务器是唯一可以访问解密密钥的一方,但是任何人都可以保存公共加密密钥。

虽然 cryptography 没有任何支持公钥加密的安全功能,但 PyNaCl 库有。PyNaCl 封装并提供了一些很好的方法来使用 Daniel J. Bernstein 发明的 NaCl 加密系统。

NaCl 始终同时 加密(encrypt)和 签名(sign)或者同时 解密(decrypt)和 验证签名(verify signature)。这是一种防止 基于可伸缩性(malleability-based)的攻击的方法,其中攻击者会修改加密值。

加密是使用公钥完成的,而签名是使用密钥完成的:


>>> from nacl.public import PrivateKey, PublicKey, Box
>>> source = PrivateKey.generate()
>>> with open("target.pubkey", "rb") as fpin:
... target_public_key = PublicKey(fpin.read())
>>> enc_box = Box(source, target_public_key)
>>> result = enc_box.encrypt(b"x marks the spot")
>>> result[:4]
b'\xe2\x1c0\xa4'

解密颠倒了角色:它需要私钥进行解密,需要公钥验证签名:


>>> from nacl.public import PrivateKey, PublicKey, Box
>>> with open("source.pubkey", "rb") as fpin:
... source_public_key = PublicKey(fpin.read())
>>> with open("target.private_key", "rb") as fpin:
... target = PrivateKey(fpin.read())
>>> dec_box = Box(target, source_public_key)
>>> dec_box.decrypt(result)
b'x marks the spot'

最后, PocketProtector 库构建在 PyNaCl 之上,包含完整的密钥管理方案。

ps:下面看下python 加密方法总结

MD5


def md5(str):
 import hashlib
 m = hashlib.md5()
 m.update(str)
 return m.hexdigest()

 base64


import base64
s = '我是字符串'
a = base64.b64encode(s)
print a
print base64.b64decode(a)
输出结果:
ztLKx9fWt/u0rg==
我是字符串

总结

以上所述是小编给大家介绍的Python玩转加密的技巧【推荐】,网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

来源:http://netsecurity.51cto.com/art/201905/596276.htm

标签:python,加密
0
投稿

猜你喜欢

  • javascript计算星座属相(十二生肖属相)示例代码

    2024-05-02 17:24:11
  • 利用anaconda保证64位和32位的python共存

    2021-07-23 09:18:24
  • vue中render函数和h函数以及jsx的使用方式

    2024-04-30 10:27:52
  • Node.js的非阻塞I/O、异步与事件驱动介绍

    2024-05-13 09:35:02
  • Python +Selenium解决图片验证码登录或注册问题(推荐)

    2022-12-30 05:41:51
  • Django安装配置mysql的方法步骤

    2024-01-21 19:18:08
  • ASP XML制作菜单管理程序

    2011-04-04 11:15:00
  • Python select及selectors模块概念用法详解

    2022-11-30 20:06:24
  • python实现在图片上画特定大小角度矩形框

    2023-03-16 22:03:14
  • javascript过滤数组重复元素的实现方法

    2023-09-08 00:41:21
  • 几款优秀的中文字体设计

    2008-03-24 17:25:00
  • mysql中获取一天、一周、一月时间数据的各种sql语句写法

    2024-01-22 04:21:06
  • 报错No module named numpy问题的解决办法

    2023-09-20 12:02:07
  • python的numpy模块安装不成功简单解决方法总结

    2022-10-23 18:33:15
  • 如何对Oracle8数据库进行维护?

    2009-11-20 18:01:00
  • 最新版 Windows10上安装Python 3.8.5的步骤详解

    2021-12-31 00:50:29
  • Python强大的自省机制详解

    2021-06-07 02:07:57
  • Vue中使用webpack别名的方法实例详解

    2024-05-11 09:13:41
  • Python使用matplotlib绘制多个图形单独显示的方法示例

    2022-02-13 09:45:44
  • Python2.x中文乱码问题解决方法

    2023-09-20 14:35:35
  • asp之家 网络编程 m.aspxhome.com