haskell 如何正确调用Data.OTP中的TOTP函数?

hrirmatl  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(124)

当我在Google身份验证器(Android)、Microsoft身份验证器(Android)和oathtool(Ubuntu 18.04.3 LTS)中使用密钥“abcdefghijklmnop”时,我得到了匹配的基于时间的一次性密码(TOTP)值。不幸的是,当我在以下Haskell代码中使用相同的密钥时,我没有得到匹配的TOTP值(无论是在Windows 10还是Ubuntu 18.04.3 LTS上):

{-# LANGUAGE OverloadedStrings #-}
import Data.OTP
import Data.Time.Clock

main = do
    -- This key is just for testing purposes
    let theSecretKey = "abcdefghijklmnop"

    -- See http://hackage.haskell.org/package/OTP-0.1.0.0/docs/Data-OTP.html#g:2
    curTime <- getCurrentTime
    let theTOTP = totp SHA1 theSecretKey curTime 30 6
    print theTOTP

我认为这意味着上面的代码有一个bug。如果我大胆猜测,“theSecretKey”或“curTime”是以无效格式传递的,但我不确定是哪一个。
我应该在上面的代码中做些什么改变才能正确地调用totp函数?

  • 注意:在使用oathtool进行测试时,我能够验证我应该使用SHA1哈希算法 *
7gs2gvoe

7gs2gvoe1#

您没有得到正确输出的原因是,您上面提到的应用和工具对密钥使用的是Base32编码。因此,我建议您使用Base32解密来解码密钥,然后应用totp函数来得到正确的TOTP值。
当解码密钥时,来自Data.ByteString.Base32包的decodeBase32函数可以派上用场。

相关问题