我一直在使用Python 3.7的cryptography.Fernet中的Fernet模块来尝试创建一个旋转的密钥结构,最近发现了MultiFernet;在这里,您可以向MultiFernet提供一个列表,并能够使用索引0进行编码,并从MultiFernet列表中的一个尝试值和错误值列表进行解码。(我希望这有道理)。
但是,模块的行为方式与this document, pages 9 and 10提供的文档之间似乎存在差异。实际上,如果我有一个预先创建的值列表,MultiFernet会存储这些值并创建加密实例,但会失去加密/解密的能力。
我的代码:

from cryptography.fernet import Fernet,MultiFernet

keystore = []
message = b"foo bar"

for x in range(4):
    keystore.append(Fernet.generate_key())

f = MultiFernet(keystore) # storing the list keystore creates a cryptographic instance here at f

token = f.encrypt(message) # Get error here, shown below

错误消息:
Traceback (most recent call last):
    File "<input>", line 1, in <module>
    File "/usr/lib64/python3.7/site-packages/cryptography/fernet.py", line 151, in encrypt return self._fernets[0].encrypt(msg)
AttributeError: 'bytes' object has no attribute 'encrypt'

在单个密钥库中使用相同的密钥
d = Fernet(keystore[0])

将提供成功,但尝试遵循配方,如文档所示
g = MultiFernet([keystore[0],keystore[1]])

返回与上面相同的错误(甚至提取单个变量的键,其中key1=keystore[0],ect)
所以我在这里无所适从。有什么想法吗?

最佳答案

经过进一步的研究,我意识到在生成密钥后,必须应用Fernet加密技术来创建MultiFernet令牌。
例子:

from cryptography.fernet import Fernet,MultiFernet

keystore = []
keyfinal = []

message = b"foo bar"
for x in range(4):

    keystore.append(Fernet.generate_key()) # generates the initial keys
    keyfinal.append(Fernet(keystore[x])) # Applies Fernet encryption to make usable keys

f = MultiFernet(keyfinal) # Set up MultiFernet on the keyfinal list
s = Fernet(keystore[2]) # Take a key from the initial keystore for single key encryption

token = s.encrypt(message) # encrypt using single key

print(f.decrypt(token)) # decrypt using MultiFernet
b"foo bar"

关于python - Python中的MultiFernet分配创建的列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53461358/

10-10 10:20