решено:
Использование фрагмента кода из библиотеки PyOTP для заполнения и кодирования ключа перед передачей его алгоритму.
missing_padding = len(key) % 8
if missing_padding != 0:
key += '=' * (8 - missing_padding)
byte_key = b32decode(key, casefold=True)
totp = cryptography.hazmat.primitives.twofactor.totp.TOTP(
byte_key,
6,
SHA1(),
30,
backend=default_backend(),
enforce_key_length=False
)
print("{:<10} {}".format(account, totp.generate(time()).decode()))
Я генерирую одноразовые пароли для 2 -факторная аутентификация с использованием криптографии и библиотек PyOTP. Однако объекты TOTP из двух библиотек дают разные выходные данные, несмотря на использование одного и того же ключа. Я подозреваю, что это что-то делает, должен ли ключ предоставляться как строковый или байтовоподобный объект, но я не уверен в том, как обрабатывать кодирование / декодирование.
Фрагмент (ключ предоставляется в виде чтения строки из (зашифрованного) файла ->
totp = cryptography.hazmat.primitives.twofactor.totp.TOTP(
key.encode(),
6,
SHA1(),
30,
backend=default_backend()
)
totp2 = pyotp.TOTP(key)
print("{:<10} {}".format(
account,
totp.generate(time()).decode()),
totp2.now()
)
Результат ->
Dropbox 508629 405771
OTP, сгенерированный PyOTP, соответствует Google Authenticator.