2010-03-29 18 views
2

我有一个安全号码发生器设备,足够小,可以放在钥匙圈上,钥匙圈上有一个六位数字的LCD显示器和一个按钮。在在线表格上输入我的账户名称和密码后,我按下安全设备上的按钮并输入显示的安全代码编号。如何使用6位数字设计安全令牌认证协议?

我每次按下按钮时都会得到一个不同的号码,并且号码生成器在帐户设置过程中必须输入背面的序列号。

我想在我的网站中加入类似的功能。据我理解,这些是主要组件:

  1. 注册期间生成的唯一Ñ数字APLHA数字序列和分配给用户(永久地)
  2. 允许用户以生成N(或M +)远程数字序列号 现在,我不在乎硬件方面,我只想知道如何选择合适的算法,以允许用户生成一个N(或M?)长序列数字序列 - 据推测,使用他的唯一ID作为种子
  3. 从步骤2中产生的号码识别用户(哪种解密方法是最强大的?)

我有以下问题:

  • 我有没有标识的所有在这样的认证系统要求?如果不是,请指出我错过了步骤和为什么它是重要的
  • 是什么我可以用于步骤1到3(最好使用64位)的最健壮的加密/解密算法?
+0

我不确定你会从随机数中识别用户。你必须给予用户一个独特的随机生成器,你知道它会产生什么,因此不是随机的。或者通过类似蓝牙的方式连接这个钥匙环设备?只是使用用户名和p-word通常对于大多数情况来说已经足够了。就存储一个随机数而言,这不是一个问题,如果您只将数据保存在服务器上,那只是在服务器上(不要被黑客入侵)。一些如何,钥匙环必须是可预测的,否则它只是噪音。 – thecoshman 2010-03-29 12:18:50

+1

看看RFC 2289的更多想法:http://www.faqs.org/rfcs/rfc2289.html – 2010-03-29 22:23:38

+0

GregS:谢谢,我把你的评论投给了 – 2010-04-04 12:09:31

回答

1

您的服务器有一个客户端ID和密钥表。每个客户也知道自己的关键。

服务器还为每个客户端维护一个计数器,初始化为零。每个客户端维护一个计数器,也被初始化为零。

当在客户端上按下按钮时,它使用其密钥作为HMAC密钥生成当前计数器值的HMAC。它从HMAC输出生成一个字母数字代码并将其显示给用户(发送给服务器)。客户端递增其计数器值。

当服务器收到认证请求时,它使用客户端存储的密钥和计数器重复与客户端相同的操作。它将它生成的字母数字代码与客户端收到的字母数字代码进行比较 - 如果它们匹配,客户端将被认证。如果它们不匹配,则服务器为该客户端递增其计数器并重复该过程,只需少量重复(例如〜10)。如果客户端计数器在未联系服务器的情况下递增,这允许服务器“赶上”。

如果计数器回滚到零,则服务器不应再接受该客户端ID的任何其他身份验证请求,直到它发出新密钥。

此基本协议有扩展:例如,您可以使用服务器和客户端上的同步时钟(每N秒更换一次值而不是每次按下按钮),而不是计数器。

0

您所描述的内容称为HOTP或基于HMAC的一次性密码。在this RFC中描述了实现,除非你有一个令人信服的理由,否则我强烈建议按原样实现它,因为它已经过密码学者的审查,并且被认为是安全的。使用此功能还可以使您与现有系统兼容 - 您应该能够找到HOTP兼容的令牌和软件应用程序,例如适用于Android的Google Authenticator。