我有一个安全号码生成器设备,小到可以放在钥匙环上,它有一个六位数的LCD显示屏和一个按钮。在在线表单上输入我的帐户名和密码后,按下安全设备上的按钮,输入显示的安全代码。
每次按下按钮时,我都会得到一个不同的号码,而号码生成器背面有一个序列号,我必须在帐户设置过程中输入该号码。
我想在我的网站中加入类似的功能。据我了解,这些是主要组成部分:
我有以下问题:
答案 0 :(得分:1)
您的服务器有一个客户端ID和密钥表。每个客户端也知道自己的密钥。
服务器还为每个客户端维护一个计数器,初始化为零。每个客户端都维护一个计数器,也初始化为零。
当在客户端上按下该按钮时,它使用其密钥作为HMAC密钥生成当前计数器值的HMAC。它从HMAC输出生成一个字母数字代码,并将其显示给用户(发送到服务器)。客户端递增其计数器值。
当服务器收到身份验证请求时,它会使用该客户端的存储密钥和计数器重复与客户端相同的操作。它将生成的字母数字代码与从客户端收到的字母数字代码进行比较 - 如果匹配,则对客户端进行身份验证。如果它们不匹配,则服务器递增其客户端的计数器并重复该过程,进行少量重复(例如,~10)。如果客户端计数器已经增加而不联系服务器,这允许服务器“赶上”。
如果计数器翻到零,服务器不应再接受该客户端ID的身份验证请求,直到它被发出新密钥。
此基本协议有扩展:例如,您可以在服务器和客户端上使用同步时钟而不是计数器(值每隔N秒更改一次,而不是每按一次按钮)。
答案 1 :(得分:1)