Ключ Fernet должен содержать 32 байта в кодировке Base64, безопасных для URL. Как создать ключ для использования с FernePython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Ключ Fernet должен содержать 32 байта в кодировке Base64, безопасных для URL. Как создать ключ для использования с Ferne

Сообщение Anonymous »

Пример ключа Fernet

Следующий код создает пример ключа 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
Быстрый взгляд на эту ссылку показывает, что = — это заполняющий символ. На самом деле там 43 символа, если не включать символ =.

Код: Выделить всё

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
Это 10 блоков по 4 символа плюс 3 символа = 43.

Создание примера ключа 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
32 байта = 256 бит. Каждый символ в кодировке Base64 имеет длину 6 бит.
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
Таким образом, даже если граница в 4 байта является каким-то странным произвольным требованием (возможно, это ошибка?), тогда это должно работать, особенно с учетом того, что ключ длиной 43 не имеет ровно 256 биты информации. Их 258.

Не работает, если ключ слишком длинный

Учитывая вышеизложенное, это неудивительно.
Если вы вообще не усекаете ключ, создается то же исключение.

Итак, как правильно сгенерировать этот ключ?

Логика усечения до 43 символов с последующим добавлением в конце символа заполнения для увеличения длины до 44 кажется произвольной.
Есть ли лучший способ сгенерировать ключ такого типа используете ввод в виде пароля?

Чтобы прояснить пару вещей:
  • Я пытаюсь детерминированно сгенерировать ключ на нескольких машинах с одной и той же фразой-паролем


Подробнее здесь: https://stackoverflow.com/questions/791 ... key-for-us
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»