我正在尝试生成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
答案 0 :(得分:0)
我在以下有关Python实现的问题here中找到了我的问题的答案。
在将secret
输入到Google身份验证器之前将totp
转换为base32是正确的,但我不知道Google身份验证器在生成代码之前将其从base32转换回常规机密。
如果我只是在secret
上向keyBytes
拨打package
给Google身份验证器,我就会收到匹配的代码。