Я пытаюсь создать TOTP таким образом, чтобы я мог использовать приложение Google Authenticator.Я использую библиотеку cryptonite
, которая обеспечивает функциональность TOTP.
Насколько я понимаю, для Google Authenticator требуется ключ в Base32.Это также требует удаления =
.Cryptonite предоставляет функцию unpad
, но я не совсем понимаю, как она работает, и поэтому не могу понять, каким должен быть первый аргумент, все, что я пробовал, заставляет функцию возвращать Nothing
.
* 1008.* В целях тестирования я выбрал ключ, который не будет заполняться, однако коды, сгенерированные моей программой, не соответствуют кодам, сгенерированным 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