Взаимодействие с Google Authenticator с использованием криптонита - PullRequest
0 голосов
/ 26 мая 2018

Я пытаюсь создать 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

1 Ответ

0 голосов
/ 26 мая 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...