python 加密库
密码学俱乐部的第一条规则是:永远不要自己发明密码系统。 密码学俱乐部的第二条规则是:永远不要自己实施密码系统:在密码系统的实施阶段以及设计中都会发现许多现实世界的漏洞。
一个有用的Python密码基元库称为cryptography 。 它既具有“安全”原语,又具有“危险品”层。 “ hazmat”层需要注意密码知识,并且很容易使用它来实现安全漏洞。 在这篇介绍性文章中,我们将不在“ hazmat”层中介绍任何内容!
加密是Fernet的实现。 Fernet是遵循最佳实践加密方法来加密缓冲区的标准。 它不适用于很大的文件-千兆字节及以上的任何文件-因为它要求您立即将要加密或解密的整个缓冲区加载到内存中。Fernet支持对称或秘密密钥加密:同一密钥用于加密和解密,因此必须保持安全。
生成密钥很容易:
>>> 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世纪中叶,密码学中最有趣的进步之一是公钥密码学。 它允许在解密密钥保密的同时发布加密密钥。 例如,它可以用于存储服务器要使用的API密钥:服务器是唯一有权访问解密密钥的设备,但是任何人都可以使用公共加密密钥添加到存储中。
尽管密码学没有任何公共密钥密码学安全原语,但PyNaCl库却有 。 PyNaCl包装并提供了一些不错的方法来使用Daniel J. Bernstein发明的NaCl加密系统。
NaCl总是同时加密 , 签名 , 解密和验证签名 。 这是一种防止基于可延展性攻击的方法,在此方法中,攻击者会修改加密值。
加密是通过公钥完成的,而签名是通过私钥完成的:
>>>
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
' \x e2 \x 1c0 \x a4'
解密反转了角色:解密需要专用密钥,而公共密钥则需要验证签名:
>>>
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构建,并包含完整的机密管理解决方案。
翻译自: https://opensource.com/article/19/4/cryptography-python
python 加密库