使用Cryptonite与Google身份验证器进行交互

时间:2018-05-26 15:08:37

标签: haskell google-authenticator totp

我正在尝试生成TOTP,以便我可以使用Google身份验证器应用。我正在使用提供TOTP功能的cryptonite库。

据我了解,Google身份验证器需要Base32中的密钥。它还需要删除=填充。 Cryptonite提供了unpad函数但我并不真正理解它是如何工作的,因此无法弄清楚第一个参数应该是什么,我尝试过的所有函数都会使函数返回{ {1}}。

出于测试目的,我选择了一个没有填充的密钥,但是我的程序生成的代码与Google身份验证器生成的密码不匹配。

代码生成的Base32密钥如下:

Nothing

将此输入Google身份验证器并不会产生与我的代码产生的结果相同的结果。

这是我的代码:

GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ

总之,我不确定如何从密钥中取消{-# 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 个字节。其次,当使用没有填充的密钥进行测试时,我仍然无法获得正确的结果。

编辑:如果它对任何人都有帮助,我确实设法在Haskell中找到某人实施Google身份验证器而不使用=但是,我仍然无法弄清楚为什么我的代码没有使用&{0} #39;工作。 Google Authenticator in Haskell

1 个答案:

答案 0 :(得分:0)

我在以下有关Python实现的问题here中找到了我的问题的答案。

在将secret输入到Google身份验证器之前将totp转换为base32是正确的,但我不知道Google身份验证器在生成代码之前将其从base32转换回常规机密。

如果我只是在secret上向keyBytes拨打package给Google身份验证器,我就会收到匹配的代码。