当我在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哈希算法 *
1条答案
按热度按时间7gs2gvoe1#
您没有得到正确输出的原因是,您上面提到的应用和工具对密钥使用的是
Base32
编码。因此,我建议您使用Base32
解密来解码密钥,然后应用totp
函数来得到正确的TOTP值。当解码密钥时,来自
Data.ByteString.Base32
包的decodeBase32
函数可以派上用场。