【发布时间】:2022-01-20 03:37:13
【问题描述】:
基于时间的一次性密码的秘密通常是 16 字节的 base32 编码字符串。例如GitHub 2FA。
但在某些情况下,它有 26 个字节长。例如Tutanota OTP。通常是带有空格的小写字母,例如:vev2 qjea un45 3sr4 q4h3 ais4 ci
我尝试使用在 dgryski/dgoogauth 和 tilaklodha/google-authenticator 中实现的 TOTP 算法。两者都可以很好地处理 16 字节的秘密,但 26 字节的秘密出现错误。
例如对于 16 字节的秘密 VEV2QJEAUN453SR4:
Time: 2021-12-17 14:31:46
Got: 079119
对于 26 字节的秘密 VEV2QJEAUN453SR4Q4H3AIS4CI:
Error: "illegal base32 data at input byte 24"
这里是sn-p的代码:
func getHOTPToken(secret string, interval int64) (string, error) {
// Converts secret to base32 Encoding
key, err := base32.StdEncoding.DecodeString(secret)
if err != nil {
return "", err
}
// Signing the value using HMAC-SHA1 Algorithm
hash := hmac.New(sha1.New, key)
err = binary.Write(hash, binary.BigEndian, uint64(interval))
if err != nil {
return "", err
}
h := hash.Sum(nil)
// Get 32 bit chunk from hash starting at the offset
offset := h[19] & 0x0f
truncated := binary.BigEndian.Uint32(h[offset : offset+4])
truncated &= 0x7fffffff
code := truncated % 1000000
return fmt.Sprintf("%06d", code), nil
}
你能告诉我如何处理 26 字节的秘密吗?
【问题讨论】:
-
请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。
标签: go authentication one-time-password totp