Authentication 如何使用6位数字设计安全令牌身份验证协议?

Authentication 如何使用6位数字设计安全令牌身份验证协议?,authentication,encryption,cryptography,Authentication,Encryption,Cryptography,我有一个安全号码发生器,小到可以放在钥匙圈上,它有一个六位数的液晶显示器和一个按钮。在在线表单上输入我的帐户名和密码后,我按下安全设备上的按钮并输入显示的安全代码 我每次按下按钮都会得到一个不同的号码,号码生成器背面有一个序列号,我必须在帐户设置过程中输入该序列号 我想在我的网站中加入类似的功能。据我所知,这些是主要的组成部分: 在注册期间生成唯一的N位aplha数字序列并分配给用户(永久) 允许用户远程生成N(或M?)位aplha数字序列 现在,我不关心硬件方面,我只想知道如何选择一个合适的算

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

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

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

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

    • 我是否确定了此类认证系统中所需的所有步骤?如果没有,请指出我遗漏了什么,以及为什么它很重要
    • 对于步骤1到3,我可以使用哪些最健壮的加密/解密算法(最好使用64位)

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

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

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

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

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


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

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

    我不确定您是否会从随机数字中识别用户。你们会给用户一个唯一的随机发生器,你们知道它会产生什么,所以不是随机的。或者这个钥匙环设备是通过蓝牙连接的吗?在大多数情况下,仅仅使用用户名和p-word就足够了。就存储一个随机数而言,这不是一个问题,如果你只在服务器上保存数据,它就在服务器上(除了被黑客攻击)。有些人认为,钥匙圈必须是可预测的,否则就是噪音。更多想法,请看RFC 2289:GregS:谢谢,我投票支持你的评论警告:6位数字的可能值空间非常小。如果您仅依赖此数字,您的系统将受到暴力攻击和碰撞攻击。