我有一个安全号码发生器设备,小到足以进行一个钥匙环,其中有一个六位数字液晶显示器和一个按钮。在网上表单上输入帐户名称和密码后,按下安全设备上的按钮,输入显示的安全代码号。
每次我按下按钮时,我都会得到一个不同的号码,而号码生成器的背面有一个序列号,在建立帐户的过程中,我必须输入序列号。
我想在我的网站中加入类似的功能。据我所知,这些都是主要的组成部分:
我有以下问题:
发布于 2010-04-02 04:30:43
您的服务器有一个客户端ID和密钥表。每个客户端也知道自己的密钥。
服务器还为每个客户端维护一个计数器,初始化为零。每个客户端维护一个计数器,也初始化为零。
当按下客户端上的按钮时,它会使用其键作为HMAC键,生成当前计数器值的HMAC。它从HMAC输出生成字母数字代码,并将其显示给用户(发送到服务器)。客户端增加其计数器值。
当服务器接收到身份验证请求时,它会使用该客户端的存储密钥和计数器重复与客户端相同的操作。它将它生成的字母数字代码与从客户端接收的字母数字代码进行比较--如果它们匹配,则对客户端进行身份验证。如果它们不匹配,服务器将为该客户端增加其计数器,并重复该进程,只需少量重复(例如,~10)。如果客户端计数器在没有与服务器联系的情况下增加,则允许服务器“追赶”。
如果计数器转到零,则在向服务器发出新密钥之前,服务器不应接受对该客户端ID的任何身份验证请求。
这个基本协议有一些扩展:例如,您可以在服务器和客户端上使用同步时钟而不是计数器(值每N秒而不是按下每个按钮)。
发布于 2011-08-15 01:18:48
您所描述的是一个HOTP,或基于HMAC的一次性密码.实现是用这个RFC描述的,除非您有令人信服的理由不这样做,否则我强烈建议按原样实现它,因为它已经被加密人员审查过,并且被认为是安全的。使用它还可以使您与现有系统兼容--您应该能够找到与HOTP兼容的令牌和软件应用程序,比如用于Android的Google身份验证程序。
https://stackoverflow.com/questions/2537652
复制相似问题