Взаимодействие с Google Authenticator с использованием криптонита

Я пытаюсь сгенерировать TOTP так, чтобы я мог использовать приложение Google Authenticator. Я использую cryptonite библиотека, которая обеспечивает функциональность TOTP.

Насколько я понимаю, Google Authenticator требует ключ в Base32. Это также требует = обивка удалена. Криптонит обеспечивает unpad функция, но я не очень понимаю, как она работает, и поэтому не могу понять, каким должен быть первый аргумент, все, что я пробовал, возвращает функцию Nothing,

В целях тестирования я выбрал ключ, который не должен содержать отступов, однако коды, сгенерированные моей программой, не соответствуют кодам, сгенерированным Google Authenticator.

Ключ Base32, созданный кодом, является следующим:

GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ

Ввод этого в Google Authenticator не дает таких же результатов, как мой код.

Вот мой код:

{-# LANGUAGE OverloadedStrings #-}

module TOTP
    ( genTOTP
    ) where

import qualified Basement.Imports        as Base (String)
import           Crypto.Data.Padding
import           Crypto.OTP              (defaultTOTPParams, totp)
import           Data.ByteArray
import           Data.ByteArray.Encoding
import           Data.Time.Clock.POSIX

genTOTP :: IO ()
genTOTP = do
    time <- getPOSIXTime
    let secret = "12345678901234567890" :: Base.String
        keyBytes = convertToBase Base32 secret :: Bytes
        key = keyBytes -- unpad (PKCS7 6) keyBytes -- I don't know what the first argument to unpad should be
        code = totp defaultTOTPParams key (round time)
    print code

Таким образом, я не уверен, как распаковать = байт от ключа. Во-вторых, при тестировании с ключом, у которого не было заполнения, я все еще не получаю правильный результат.

РЕДАКТИРОВАТЬ: Если это кому-то поможет, мне удалось найти чью-то реализацию Google Authenticator в Haskell без использования cryptonite Тем не менее, я до сих пор не смог понять, почему мой код не работает. Google Authenticator в Haskell

1 ответ

Решение

Я нашел ответ на свой вопрос в следующем вопросе, касающемся реализации на Python, здесь.

Я был прав, чтобы преобразовать secret до base32, прежде чем вводить его в Google Authenticator, но я не знал, что Google Authenticator преобразовал его из base32 в обычный секрет, прежде чем генерировать код.

Если я просто позвоню totp на secret войдя keyBytes в Google Authenticator, я получаю соответствующие коды.

Другие вопросы по тегам