Random 为联机应用程序生成一次性脱机数字代码

Random 为联机应用程序生成一次性脱机数字代码,random,one-time-password,Random,One Time Password,我需要从电路板生成一个一次性数字代码,该代码必须通过在线web应用程序进行验证,如果令牌有效,该应用程序将在其数据库中记录该代码 令牌的生成对于用户来说当然是不可预测的,用户只需单击电路板上的一个按钮,就可以获得生成的令牌 在线应用程序必须能够验证令牌,而无需直接与电路板通信 董事会和web应用程序可以使用什么算法?网上有类似的例子吗 请注意,电路板可能与web服务不同步(即用户按下按钮6次并生成6个令牌),web服务必须能够验证这些令牌 例如,该算法必须足够简单,可以在Arduino中实现,将

我需要从电路板生成一个一次性数字代码,该代码必须通过在线web应用程序进行验证,如果令牌有效,该应用程序将在其数据库中记录该代码

令牌的生成对于用户来说当然是不可预测的,用户只需单击电路板上的一个按钮,就可以获得生成的令牌

在线应用程序必须能够验证令牌,而无需直接与电路板通信

董事会和web应用程序可以使用什么算法?网上有类似的例子吗

请注意,电路板可能与web服务不同步(即用户按下按钮6次并生成6个令牌),web服务必须能够验证这些令牌


例如,该算法必须足够简单,可以在Arduino中实现,将来甚至可以直接在集成电路中实现。

假设您有一个秘密密码p,保存在令牌生成器和令牌验证器中

令牌生成器生成一个随机数N,并将其与hmac_sha1(N,p)连接起来。有关HMAC的更多信息,请查看。您的令牌的格式为randomNumber_hmac,如下所示:

0123456_0xfbdb1d1b18aa6c08324b7d64b71fb76370690e1d

然后你的接收者可以解析这个令牌来提取随机数(这里是0123456)并计算hmac_sha1(0123456,p)。如果它与令牌中给出的HMAC匹配,则意味着它是由知道p。。。应该是令牌生成器


这些是指针。可以实现更好的安全性(第一步是使用散列而不仅仅是随机数),但这应该已经非常可靠了。只要令牌的第一部分中有一些强随机成分,您也可以将其与其他数据连接起来。例如,使用UUID,您可以100%(只需稍微四舍五入)确保每次生成不同的令牌,并且令牌验证器可以检查每个令牌仅使用一次。

假设您有一个秘密密码p,保存在令牌生成器和令牌验证器中

令牌生成器生成一个随机数N,并将其与hmac_sha1(N,p)连接起来。有关HMAC的更多信息,请查看。您的令牌的格式为randomNumber_hmac,如下所示:

0123456_0xfbdb1d1b18aa6c08324b7d64b71fb76370690e1d

然后你的接收者可以解析这个令牌来提取随机数(这里是0123456)并计算hmac_sha1(0123456,p)。如果它与令牌中给出的HMAC匹配,则意味着它是由知道p。。。应该是令牌生成器

这些是指针。可以实现更好的安全性(第一步是使用散列而不仅仅是随机数),但这应该已经非常可靠了。只要令牌的第一部分中有一些强随机成分,您也可以将其与其他数据连接起来。例如,使用UUID,您可以100%(只需一点舍入)确保每次生成一个不同的令牌,并且令牌验证器可以检查每个令牌是否只使用一次。

看看HOTP(RFC 4226)或TOTP(RFC 6238)算法。该算法是一次性密码生成的标准

此外,我可以建议您不要发明轮子,而要使用世界知名的强大身份验证提供商提供的全面、安全的解决方案:, RSA(第一次尝试时无法用谷歌搜索)。 所有这些公司都有广泛的OTP生成专用安全设备和检查软件选择。 该设备的价格不足以让您自己发明一款,例如,Protectimus提供符合TOTP标准的设备,价格为7美元(解决方案页面)
当然,如果您没有额外的特殊要求,您可以选择其中的一种,看看HOTP(rfc4226)或TOTP(rfc6238)算法。该算法是一次性密码生成的标准

此外,我可以建议您不要发明轮子,而要使用世界知名的强大身份验证提供商提供的全面、安全的解决方案:, RSA(第一次尝试时无法用谷歌搜索)。 所有这些公司都有广泛的OTP生成专用安全设备和检查软件选择。 该设备的价格不足以让您自己发明一款,例如,Protectimus提供符合TOTP标准的设备,价格为7美元(解决方案页面)

如果您没有额外的特殊要求,当然可以选择其中一个,对不起,但我不认为我在关注这个问题。如果您只是在寻找一种安全地生成随机数的方法,那么这与AES有什么关系?当然AES应该使用随机数进行数据加密,但AES肯定不是随机数生成器。你在寻找一个随机数生成器还是一个完整的加密系统?一个随机令牌生成器和一个令牌验证器,它在不与生成器通信的情况下验证它们,忽略AES…很抱歉这么晚才回复你的评论。事实上,你对AES的评论激发了我一个有趣的想法。如何生成您的随机数,在数字的字符串版本的末尾追加一个分隔符,然后追加一个纯文本sentinel值。然后,您可以获取该字符串并对其进行RSA加密。RSA加密的输出将是您的令牌。如果令牌可以被成功解密并包含前哨值,那么令牌是真的,消息的第一部分(在定界符之前)是生成的随机数。对不起,我没有很好地得到你的解决方案,但是我想说的是AVR攻击者生成了10个最大数字,里面的RSA已经太多了。相当简单,它的过程与personne3000推荐的差不多,但是CRC32输出一个32位(4字节)的散列。这4个字节可以用8个十六进制字符表示,这将为连接2个字符的标识符留出空间