Взаимодействие с 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, я получаю соответствующие коды.