TOTP(基于时间的一次性密码)是一种广泛使用的多因素认证技术,它通过算法生成一个与时间相关的一次性密码,通常每30秒或60秒更换一次。这种密码在你输入后会失效,因此即使有人截获了密码,他们也无法在下一次登录时使用它,从而大大增加了账户的安全性。
TOTP的工作原理
- 密钥共享:用户和服务器之间共享一个密钥,这个密钥通常是一个Base32编码的字符串。
- 时间同步:用户设备和服务器需要时间同步,以确保生成的密码一致。
- 时间步长:TOTP使用固定的时间步长,通常是30秒。
- 密码生成:在每个时间步长结束时,使用共享密钥和当前时间生成一个6位或8位的密码。
TOTP的安全性
- TOTP算法基于HMAC(Hash-Based Message Authentication Code)算法,确保生成的密码具有高安全性。
- 使用哈希函数(如SHA-1、SHA-256和SHA-512)来增强密码的复杂度。
- 由于密码是时间敏感的,即使密码被截获,攻击者也很难在有限的时间内使用它。
TOTP的应用场景
- 多因素认证:用于网站和应用程序的多因素认证,提高账户安全性。
- 银行和金融服务:用于生成动态密码,保护交易安全。
- 虚拟私人网络(VPN):用于VPN连接的二次验证,防止未授权访问。
- 智能卡和令牌:TOTP算法被集成在智能卡和硬件令牌中,提供额外的安全层。
如何使用TOTP
- 选择身份验证器工具:可以使用专门的手机应用或密码管理程序。
- 从账户申请密钥:登录账户并找到安全设置,请求二维码。
- 扫描二维码:使用手机应用扫描服务器提供的二维码。
- 登录时输入验证码:在登录时输入身份验证器工具上显示的当前验证码。
使用TOTP可以为你的账户提供一层额外的安全保护,即使在大规模数据泄露和其他网络攻击中,也能保护你的账户不被未授权访问。
如何使用TOTP进行SSH登录认证(C/C++代码实现)
SSH登录的可选认证码TOTP(基于时间的一次性密码,Time-based One-Time Password)提供了一种额外的安全措施,与Google Authenticator移动应用兼容。这种认证方式基于Richard Taylor的Ruby实现。
这段代码是一个用于验证一次性密码(HOTP,基于时间的一次性密码)的程序。它通常用于SSH登录验证。
...
int b32decode(const char *s, unsigned char *b)
{
int i;
memset(b, 0, 10);
for (i = 0; i < 16; i++) {
unsigned char x;
if (isalpha(s[i])) {
x = toupper(s[i]) - 'A';
} else if (s[i] >= '2' && s[i] <= '7') {
x = s[i] - '2' + 26;
} else {
return 0;
}
...
}
return 1;
}
void hotp(const unsigned char *sbytes, time_t movingFactor, char *code)
{
unsigned char data[8];
int i, offset, bin_code, otp;
for (i = 0; i < 8; i++) {
data[i] = i < 4 ? 0 : movingFactor >> (56 - 8*i);
}
unsigned char *r = HMAC(EVP_sha1(), sbytes, 10, data, sizeof(data), NULL, NULL);
offset = r[19] & 0xf;
bin_code = ((r[offset] << 24) | (r[offset+1] << 16) | (r[offset+2] << 8) | r[offset+3]) & 0x7fffffff;
...
}
void proceed()
{
if (getenv("SSH_ORIGINAL_COMMAND") != NULL) {
execl("/bin/sh", "/bin/sh", "-c", getenv("SSH_ORIGINAL_COMMAND"), NULL);
} else {
execl(getenv("SHELL"), "-", NULL);
}
}
int main(int argc, char *argv[])
{
...
input = getenv("OTP_TOKEN");
if (!input || strcmp(input, "") == 0) {
input = getpass("Enter the validation code: ");
if (input == NULL || strlen(input) != 6) {
fprintf(stderr, "Invalid\n");
exit(1);
}
}
if (!b32decode(argv[1], sbytes)) {
exit(1);
}
now = time(NULL);
for (i = 0; i <= MAX_SKEW; i++) {
hotp(sbytes, now / 30 + i, code);
if (strncmp(input, code, 6) == 0) {
proceed();
}
hotp(sbytes, now / 30 - i, code);
if (strncmp(input, code, 6) == 0) {
proceed();
}
}
fprintf(stderr, "Invalid\n");
return 1;
}
If you need the complete source code, please add the WeChat number (c17865354792)
运行程序: 使用以下命令运行程序(假设程序编译后的名称为ssh-hotp-auth
):
./ssh-hotp-auth MFRGGZDFMZTWQ2LK
如何使用TOTP进行SSH登录认证
要使用TOTP进行SSH登录认证,您需要使用SSH密钥。您需要修改authorized_keys
文件,添加一个command=
参数:
command="/usr/bin/ssh-hotp-auth 4rr7kc47sc5a2fgt" ssh-dsa AAA...
请根据您的实际情况调整ssh-hotp-auth
的路径。
这里的4rr7kc47sc5a2fgt
是一个密钥,您需要自己生成(显然,不要使用这个示例密钥)。如果您愿意,可以在random.org生成一个新的随机密钥,或者使用您信任的任何其他方法。密钥是一个16个字符的Base32字符串(a-z2-7),所以如果您使用random.org,可以替换掉0、1、8和9以外的任何字母或数字。
如何配置Google Authenticator移动应用
要配置您的Google Authenticator移动应用,请按照以下步骤操作:
- 打开Google Authenticator应用。
- 添加一个新条目。
- 使用与SSH服务器相同的密钥。
确保您的移动设备上的时钟与SSH服务器的时钟同步。
总结
使用TOTP的好处在于它提供了一种动态的、一次性的密码,每次生成的密码只能使用一次,这大大增加了登录的安全性。即使有人窃取了您的密码,如果没有当前的TOTP,他们也无法登录。
此外,TOTP与Google Authenticator等移动应用兼容,使得您可以方便地在移动设备上生成和使用一次性密码。
We also undertake the development of program requirements here. If necessary, please follow the WeChat official account 【程序猿编码】and contact me