Следующий код создает пример ключа Fernet и сообщает, что его длина равна 44.
Код: Выделить всё
from cryptography.fernet import Fernet
generated_key = Fernet.generate_key()
print(f'Example generated key: {generated_key}')
print(f'Length of example key: {len(generated_key)}')
Код: Выделить всё
Example generated key: b'U4f1fCfXWlz7pQ-7WdZKmCY-VtSAln7R-hhvF6qgYa4='
Length of example key: 44
Код: Выделить всё
U4f1fCfXWlz7pQ-7WdZKmCY-VtSAln7R-hhvF6qgYa4
1 2 3 4 5 6 7 8 9 10 11
U4f1 fCfX Wlz7 pQ-7 WdZK mCY- VtSA ln7R -hhv F6qg Ya4
Создание примера ключа Fernet
Я пытаюсь сгенерировать пример ключа, используя следующий код:
Код: Выделить всё
key = "1234567890123456789012345678901234567890"
print(f'Encryption key is: {key}')
base64_key = base64.b64encode(key.encode('utf-8'))
print(f'Base64 encoded key is: {base64_key}')
print(f'Length of base64 encoded key: {len(base64_key)}')
if len(base64_key) > 43:
base64_key = base64_key[:43]
print(f'Truncating key to length {43}: {base64_key}')
print(f'Length of base64 encoded key is now {len(base64_key)}')
elif len(base64_key) < required_key_length_characters:
print(f'error: key is too short')
raise RuntimeError(f'key too short')
fernet_instance = Fernet(base64_key)
Код: Выделить всё
Encryption key is: 1234567890123456789012345678901234567890
Base64 encoded key is: b'MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MA=='
Length of base64 encoded key: 56
Truncating key to length 43: b'MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI'
Length of base64 encoded key is now 43
binascii.Error: Incorrect padding
Код: Выделить всё
base64_key = base64_key + b'='
Какой длины должен быть ключ Fernet?
Исключение, созданное моим код говорит
Код: Выделить всё
ValueError: Fernet key must be 32 url-safe base64-encoded bytes
256/6 = 42,6666... или 43, если округлить в большую сторону. Это соответствует длине ключа, созданного Fernet.generate_key().
Почему это не работает, если ключ слишком короткий?
Ключ длиной 43 символа содержит достаточно битов для 256-битного шифрования. Так почему же это не работает?
На самом деле он содержит чуть больше 256 бит информации. 43 * 6 = 258
Почему это не работает, если ключ имеет правильную длину?
Ключ из 44 символов содержит достаточно битов, чтобы 256-битное шифрование и соответствует границе в 4 байта. Но это все равно не удается и выдает следующее исключение:
Код: Выделить всё
ValueError: Fernet key must be 32 url-safe base64-encoded bytes
Не работает, если ключ слишком длинный
Учитывая вышеизложенное, это неудивительно.
Если вы вообще не усекаете ключ, создается то же исключение.
Итак, как правильно сгенерировать этот ключ?
Логика сокращения до 43 символов с последующим добавлением Символ заполнения в конце для увеличения длины до 44 кажется произвольным.
Есть ли лучший способ сгенерировать ключ такого типа с использованием ввода в стиле пароля?
Подробнее здесь: https://stackoverflow.com/questions/791 ... key-for-us