gpt4 book ai didi

c# - C# 中基于 HMAC 的一次性密码 (RFC 4226 - HOTP)

转载 作者:太空狗 更新时间:2023-10-29 21:30:42 25 4
gpt4 key购买 nike

我正试图全神贯注地生成一个 6 位/字符不区分大小写的一次性密码。

我的来源是https://www.rfc-editor.org/rfc/rfc4226#section-5

先定义参数

C       8-byte counter value, the moving factor.  This counter
MUST be synchronized between the HOTP generator (client)
and the HOTP validator (server).

K shared secret between client and server; each HOTP
generator has a different and unique secret K.

T throttling parameter: the server will refuse connections
from a user after T unsuccessful authentication attempts.

然后我们有了生成HOTP的算法

As the output of the HMAC-SHA-1 calculation is 160 bits, we must
truncate this value to something that can be easily entered by a
user.

HOTP(K,C) = Truncate(HMAC-SHA-1(K,C))

然后,我们将 Truncate 定义为

String = String[0]...String[19]
Let OffsetBits be the low-order 4 bits of String[19]
Offset = StToNum(OffsetBits) // 0 <= OffSet <= 15
Let P = String[OffSet]...String[OffSet+3]
Return the Last 31 bits of P

然后提供了一个 6 位 HOTP 的例子

The following code example describes the extraction of a dynamic
binary code given that hmac_result is a byte array with the HMAC-
SHA-1 result:

int offset = hmac_result[19] & 0xf ;
int bin_code = (hmac_result[offset] & 0x7f) << 24
| (hmac_result[offset+1] & 0xff) << 16
| (hmac_result[offset+2] & 0xff) << 8
| (hmac_result[offset+3] & 0xff) ;

在尝试将其转换为有用的 C# 代码以生成一次性密码时,我相当不知所措。我已经有了创建过期 HMAC 的代码,如下所示:

byte[] hashBytes = alg.ComputeHash(Encoding.UTF8.GetBytes(input));
byte[] result = new byte[8 + hashBytes.Length];

hashBytes.CopyTo(result, 8);
BitConverter.GetBytes(expireDate.Ticks).CopyTo(result, 0);

我只是不确定如何从那个开始,到上述算法中建议的 6 位数。

最佳答案

这里有两个问题:

  1. 如果您要生成字母数字,则不符合 RFC - 在这一点上,您可以简单地获取任何 N 个字节并将它们转换为十六进制字符串并获得字母数字。或者,convert them to base 36如果你想要 a-z 和 0-9。 RFC 的第 5.4 节为您提供了一组 Digit 参数的标准 HOTP 计算(请注意 Digit 是与 C 一起的参数,KT)。如果您选择忽略此部分,则无需转换代码 - 只需使用您想要的内容即可。

  2. 您的“结果”字节数组的过期时间简单地填充在散列后的前 8 个字节中。如果您对 6 位字母数字的截断没有收集这些以及部分哈希值,那么它也可能根本不被计算。 “伪造”或重播也很容易 - 将 secret 散列一次,然后在它前面放任何你想要的标记 - 而不是真正的一次性密码。请注意,RFC 中的参数 C 旨在满足到期窗口,并且应该在计算哈希代码之前添加到输入中。

关于c# - C# 中基于 HMAC 的一次性密码 (RFC 4226 - HOTP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4308003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com