加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

Python如何玩转加密?

发布时间:2019-05-15 01:36:33 所属栏目:建站 来源:佚名
导读:暗码学俱乐部的第一条法则是:永久不要本身发现暗码体系。暗码学俱乐部的第二条法则是:永久不要本身实现暗码体系:在实际天下中,在实现以及计划暗码体系阶段都找到过很多裂痕。 Python 中的一个有效的根基加密库就叫做 cryptography 。它既是一个安详方

暗码学俱乐部的第一条法则是:永久不要本身发现暗码体系。暗码学俱乐部的第二条法则是:永久不要本身实现暗码体系:在实际天下中,在实现以及计划暗码体系阶段都找到过很多裂痕。

Python怎样玩转加密?

Python 中的一个有效的根基加密库就叫做 cryptography 。它既是一个“安详”方面的基本库,也是一个“伤害”层。“伤害”层必要越发警惕和相干的常识,而且行使它很轻易呈现安详裂痕。在这篇先容性文章中,我们不会涵盖“伤害”层中的任何内容!

cryptography 库中最有效的高级安详成果是一种 Fernet 实现。Fernet 是一种遵循最佳实践的加密缓冲区的尺度。它不合用于很是大的文件,如千兆字节以上的文件,由于它要求你一次加载要加密或解密的内容到内存缓冲区中。

Fernet 支持 对称(symmetric)(即 密钥(secret key))加密方法*:加密息争密行使沟通的密钥,因此必需保持安详。

天生密钥很简朴:

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

这些字节可以写入有恰当权限的文件,最好是在安详的呆板上。

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

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

假如在你的呆板上加密,你会看到略微差异的值。不只由于(我但愿)你天生了和我差异的密钥,并且由于 Fernet 将要加密的值与一些随机天生的缓冲区毗连起来。这是我之条件到的“最佳实践”之一:它将阻止敌手判别哪些加密值是沟通的,这偶然是进攻的重要部门。

解密同样简朴:

  1. >>> frn = fernet.Fernet(k)  
  2. >>> frn.decrypt(encrypted)  
  3. 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)的进攻的要领,个中进攻者会修改加密值。

加密是行使公钥完成的,而署名是行使密钥完成的:

  1. >>> from nacl.public import PrivateKey, PublicKey, Box  
  2. >>> source = PrivateKey.generate()  
  3. >>> with open("target.pubkey", "rb") as fpin:  
  4. ... target_public_key = PublicKey(fpin.read())  
  5. >>> enc_box = Box(source, target_public_key)  
  6. >>> result = enc_box.encrypt(b"x marks the spot")  
  7. >>> result[:4]  
  8. b'xe2x1c0xa4' 

解密颠倒了脚色:它必要私钥举办解密,必要公钥验证署名:

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

最后, PocketProtector 库构建在 PyNaCl 之上,包括完备的密钥打点方案。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读