Ano*_*ous 4 cryptography python-2.7
from cryptography.fernet import Fernet
import base64
# Put this somewhere safe!
key = Fernet.generate_key()
f = Fernet()
token = f.encrypt(b"A really secret message. Not for prying eyes.")
token
print f.decrypt(token)
Run Code Online (Sandbox Code Playgroud)
我怎样才能生成自己的密钥而不是fernet.genrate_key()?
该实现显示了如何完成此操作:
return base64.urlsafe_b64encode(os.urandom(32))
Run Code Online (Sandbox Code Playgroud)
因此,要生成您自己的,您将需要生成32个加密安全随机字节,然后urlsafe base64编码它们.当然,既然generate_key已经这样做了,你应该调用它,除非你需要在Python进程之外生成密钥.
小智 8
在 fernet 中,可以使用 fernet 的密钥派生函数之一生成密钥
fernet 提供的功能之一是“基于密码的密钥导出功能 2”。使用 PBKDF2HMAC 的示例可以在使用 Fernet 密码中找到。这在pyca/cryptography 的 git issues #1333中进行了讨论,maebert 指出该示例使用 salt=os.urandom(16),并且每次使用不同的 salt 值构造 kdf 类时都会从密码生成一个新密钥。
如果您需要使用自定义密钥派生函数,请查看kdf 和pbkdf2的源代码 ,以获取实现 KeyDerivationFunction 接口的类的示例。
与其签名匹配并实现接口的类应该能够作为自定义密钥派生函数放入。
在 Bash 中,您可以执行以下操作:
dd if=/dev/urandom bs=32 count=1 2>/dev/null | openssl base64
Run Code Online (Sandbox Code Playgroud)
python Cyrptography Fernet 文档password有一个关于使用and生成安全密钥的注释salt:
import base64
import os
from cryptography.fernet import Fernet
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
password = b"password"
salt = os.urandom(16)
kdf = PBKDF2HMAC(
algorithm=hashes.SHA256(),
length=32,
salt=salt,
iterations=390000,
)
key = base64.urlsafe_b64encode(kdf.derive(password))
f = Fernet(key)
token = f.encrypt(b"Secret message!")
token
# b'...'
f.decrypt(token)
# b'Secret message!'
Run Code Online (Sandbox Code Playgroud)
请注意,盐必须与密码一起存储,以便重新生成相同的密钥;这让人感觉有点多余,尽管它确实增加了一层混淆。最好只是使用Fernet.generate_key()和存储它。