如何使用6位数设计安全令牌认证协议?

时间:2010-03-29 12:02:32

标签: authentication encryption cryptography

我有一个安全号码生成器设备,小到可以放在钥匙环上,它有一个六位数的LCD显示屏和一个按钮。在在线表单上输入我的帐户名和密码后,按下安全设备上的按钮,输入显示的安全代码。

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

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

  1. 在注册期间生成唯一的N位数字aplha数字序列并分配给用户(永久)
  2. 允许用户远程生成N(或M?)位数字aplha数字序列 现在,我不关心硬件方面,我只想知道如何选择一个合适的算法,允许用户生成一个N(或M?)长的aplha数字序列 - 可能是,使用他的唯一ID作为种子
  3. 从步骤2中生成的数字中识别用户(哪种解密方法最强健?)
  4. 我有以下问题:

    • 我是否已确定此类身份验证系统所需的所有步骤?如果没有,请指出我错过的内容及其重要性
    • 我可以在步骤1到3中使用哪种最强大的加密/解密算法(最好使用64位)?

2 个答案:

答案 0 :(得分:1)

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

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

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

当服务器收到身份验证请求时,它会使用该客户端的存储密钥和计数器重复与客户端相同的操作。它将生成的字母数字代码与从客户端收到的字母数字代码进行比较 - 如果匹配,则对客户端进行身份验证。如果它们不匹配,则服务器递增其客户端的计数器并重复该过程,进行少量重复(例如,~10)。如果客户端计数器已经增加而不联系服务器,这允许服务器“赶上”。

如果计数器翻到零,服务器不应再接受该客户端ID的身份验证请求,直到它被发出新密钥。

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

答案 1 :(得分:1)

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