Wolf_Yout
@Wolf_Yout

PyOtp постоянно ошибка binanscii.Error: Non-base 32 digit found. Как исправить?

Код
import pyotp 

key = "letters1keydog963"
totp = pyotp.TOTP(key)
print(totp.now())

def login(code: int):
    rs = totp.verify(code)
    print("Добро пожаловать, {}".format(key)) if rs else print("Неверный код. Попробуйте еще раз.")

if __name__ == "__main__":
    login(input("Введите код подтверждения:  "))

В консоли:
Traceback (most recent call last):
File "C:\py projects\otp\login.py", line 11, in
print(totp.now())
^^^^^^^^^^
File "C:\Users\shits\AppData\Local\Programs\Python\Python312\Lib\site-packages\pyotp\totp.py", line 64, in now
return self.generate_otp(self.timecode(datetime.datetime.now()))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\shits\AppData\Local\Programs\Python\Python312\Lib\site-packages\pyotp\otp.py", line 35, in generate_otp
hasher = hmac.new(self.byte_secret(), self.int_to_bytestring(input), self.digest)
^^^^^^^^^^^^^^^^^^
File "C:\Users\shits\AppData\Local\Programs\Python\Python312\Lib\site-packages\pyotp\otp.py", line 52, in byte_secret
return base64.b32decode(secret, casefold=True)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\shits\AppData\Local\Programs\Python\Python312\Lib\base64.py", line 254, in b32decode
return _b32decode(_b32alphabet, s, casefold, map01)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\shits\AppData\Local\Programs\Python\Python312\Lib\base64.py", line 236, in _b32decode
raise binascii.Error('Non-base32 digit found') from None
binascii.Error: Non-base32 digit found

При этом в приложении вместо кода видно только _ _ _ _ _ _:
670d8d2a2c57e609703729.jpeg

Забыл упомянуть, я пробовал пересоздать ключ несколько раз, это не помогало
  • Вопрос задан
  • 63 просмотра
Пригласить эксперта
Ответы на вопрос 1
@galaxy
key = "letters1keydog963"
totp = pyotp.TOTP(key)


Конструктор ожидает ключ, закодированный в Base32, а там нет символов 0, 1, 8 и 9 (в документации это как-то очень вскользь прописано).

Для произвольных, в т.ч. бинарных, ключей используйте base64.b32encode.

Как я понял, так они сделали ради совместимости с Google Authentificator:

Parameters
Secret
REQUIRED: The secret parameter is an arbitrary key value encoded in Base32 according to RFC 3548. The padding specified in RFC 3548 section 2.2 is not required and should be omitted.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы