简介
基于令牌的动态口令(Token-based One-Time Password,简称TOTP)是一种用于身份验证的安全机制,它生成一次性密码(One-Time Password,简称OTP),通常用于双因素认证(2FA)或多因素认证(MFA)中。
- 动态口令
- 就是用于一次性使用的验证码
- 例如: 每次登录时一次一密, 口令1分钟内有效
- 令牌
- 可以认为是双方共同约定的一个相同的私有密钥, 双方基于这个密钥算出动态口令
原理
- 基于时间的动态口令
- 服务器和客户端的时间必须一致
- 服务器和客户端使用相同的算法, 混合时间和私有共享密钥计算出动态口令
- 服务器验证客户端输入的口令是否一致
实现
客户端和服务器端使用相同的算法实现, 确保时间保持一致, 精确到1分钟, 也就是说在1分钟内动态口令有效
动态口令生成算法
C++
代码示例
class MyOTP
{
public:
// 获取验证码
static CStringA GetCode(CStringA key = "xxxxxx")
{
CTime c_time = CTime::GetCurrentTime();
CStringA str_time;
// 年月日时分 -> 2023/10/11 12:12
// 精确到1分钟, 没有考虑时间边界问题
str_time.Format("%04d/%02d/%02d %02d:%02d", c_time.GetYear(), c_time.GetMonth(), c_time.GetDay(), c_time.GetHour(), c_time.GetMinute());
CStringA mix = key + str_time;
// 计算hash值
CStringA code = sha256((PBYTE)mix.GetBuffer(), mix.length()).c_str();
code.MakeUpper();
return code.Left(6);
}
};