【问题标题】:Generate one-time offline numeric code for online application在线申请生成一次性离线数字代码
【发布时间】:2014-09-12 09:25:31
【问题描述】:

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

令牌的生成当然必须是用户无法预测的,用户只需单击板上的按钮并取回生成的令牌。

在线应用程序必须能够在不直接与董事会通信的情况下验证令牌。

板子和网络应用程序可以使用什么算法?网上有没有类似的例子?

请注意,看板可能与网络服务不同步(即用户按下按钮 6 次并生成 6 个令牌),但网络服务必须能够验证它们。

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

【问题讨论】:

  • 对不起,我不相信我在关注这个问题。如果您只是在寻找一种安全地生成随机数的方法,那么这与 AES 有什么关系?当然 AES 应该使用随机数进行数据加密,但 AES 肯定不是随机数生成器。您是在寻找随机数生成器还是整个​​加密系统?
  • 一个随机令牌生成器和一个令牌验证器在不与生成器通信的情况下验证它们,忽略 AES...
  • 很抱歉这么晚才回复您的评论。实际上,您对 AES 的评论引发了我一个有趣的想法。如何生成随机数,将分隔符附加到数字的字符串版本的末尾,然后附加纯文本标记值。然后,您可以获取该字符串并 RSA 对其进行加密。 RSA 加密的输出将是您的令牌。如果令牌可以成功解密并包含标记值,则令牌是真实的,并且消息的第一部分(在分隔符之前)是生成的随机数。
  • 抱歉,我没有完全理解您的解决方案,但请考虑一下,我说的是 AVR 服装,最多可生成 10 位数字,里面的 RSA 已经太多了。
  • 比较简单,和 personne3000 推荐的过程差不多,但是 CRC32 输出一个 32 位(4 字节)的哈希。这 4 个字节可以用 8 个十六进制字符表示,这将为您留出空间来连接 2 个字符的标识符,指示您在 CRC32 哈希中使用的盐。我之所以提到它,是因为我认为 SHA1 HMAC 对于 Attiny 来说可能会占用一些资源。

标签: random one-time-password


【解决方案1】:

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

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

0123456_0xfbdb1d1b18aa6c08324b7d64b71fb76370690e1d

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

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

【讨论】:

  • 只是把它扔在那里,将“秘密”盐/胡椒 (p) 放入令牌生成器是不安全的。一旦你把它放在生成器中,它就真的是一个公共的盐/胡椒。
  • 它当然不安全,但对于我的应用程序来说,一旦它被写入焊接到板上的嵌入式 Attiny 中就足够安全了。
【解决方案2】:

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

另外,我建议您不要发明轮子,而是使用来自世界知名的强大身份验证提供商之一的全面且安全的解决方案:VascoProtectimus、 RSA(无法从第一次尝试谷歌它)。 他们有多种选择用于 OTP 生成的特殊安全设备和检查它的软件。 该设备的价格与其说是发明自己的设备,不如说是 Protectimus 提供符合 TOTP 标准的设备,起价为 7 美元(解决方案页面)。
当然,如果您没有一些额外的特殊要求,您可以选择其中之一

【讨论】:

  • 我需要在 AVR 服装中创建一个简单的算法,或者更多,所以强大的身份验证芯片太多了。
  • 如果您可以在芯片内使用任何散列函数,则可以按照@personne3000 的建议生成 OTP。我的回答中上面描述的算法使用相同的原理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
  • 2017-03-21
  • 1970-01-01
  • 2010-09-10
相关资源
最近更新 更多