Я пытаюсь сгенерировать TOTP, чтобы я мог использовать приложение Google Authenticator. Я использую библиотеку cryptonite
, которая обеспечивает функциональность TOTP.
Насколько я понимаю, Google Authenticator требует ключ в Base32. Это также требует удаления заполнения =
. Cryptonite предоставляет функцию 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
unpad
я не получаю правильных кодов. У вас есть идеи, почему это может происходить? - person James Burton   schedule 26.05.2018convertFromBase
, а неconvertToBase
. - person Carl   schedule 26.05.2018