使用Python Fernet生成自己的密钥

时间:2017-06-08 10:16:46

标签: python-2.7 cryptography

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)

如何生成自己的密钥而不是fernet.genrate_key()

3 个答案:

答案 0 :(得分:8)

该实现显示了如何完成此操作:

return base64.urlsafe_b64encode(os.urandom(32))

因此,为了生成您自己的,您将需要生成32个加密安全的随机字节,然后urlsafe base64对它们进行编码。当然,由于generate_key已经这样做了,你应该调用它,除非你需要在Python进程之外生成密钥。

答案 1 :(得分:1)

在Bash中,你可以这样做:

dd if=/dev/urandom bs=32 count=1 2>/dev/null | openssl base64

来源:The Ruby implementation of Fernet

答案 2 :(得分:1)

在Fernet中,可以使用Fernet的Key Derivation Functions之一来生成密钥

fernet提供的功能之一是“基于密码的密钥派生功能2”。 可以在Using Passwords with Fernet找到使用PBKDF2HMAC的示例。在git issue #1333 of pyca/cryptography中对此进行了讨论,maebert指出,该示例使用salt = os.urandom(16),并且每当用不同的salt值构造kdf类时,都会从密码生成一个新密钥。

如果您需要使用自定义密钥派生功能,请查看kdf的源代码 和pbkdf2 具有实现KeyDerivationFunction接口的类的示例。

匹配其签名并实现该接口的类应该能够作为自定义键派生函数插入。