📜  一次性密码的实现(1)

📅  最后修改于: 2023-12-03 14:48:46.370000             🧑  作者: Mango

一次性密码的实现

什么是一次性密码

一次性密码(One-Time Password,简称OTP)是指在每次使用之前都不相同的密码。这种密码可以有效防止重放攻击等安全问题,被广泛应用于各种场景,如银行转账、网站登录等。

实现方式

一次性密码的实现方式有多种,常用的如下:

时间同步算法(Time-Based OTP,简称TOTP)

TOTP是基于时间的一次性密码算法。它将时间作为动态因素(Dynamic Factor),每隔一段时间就生成一个与之对应的一次性密码。这样,在每次验证时,将输入的密码与当前时间计算出的密码进行比较,只有两者相等才能通过验证。

TOTP的实现方式分为以下几步:

  1. 客户端向服务器获取一个随机种子(Seed),并保存在本地;
  2. 客户端利用随机种子和当前时间计算出一次性密码;
  3. 客户端将一次性密码发送给服务器;
  4. 服务器利用相同的Seed和当前时间验证客户端发送的密码是否正确。

其中,Seed是一个基本不可预测的值,通常使用HMAC-SHA1等加密算法生成。TOTP的周期默认为30秒,一次性密码的长度默认为6位。

以下为Python代码片段,用于生成TOTP码:

import hmac
import hashlib
import time

def generate_totp(seed):
    t = int(time.time()) // 30
    hm = hmac.new(seed.encode('utf-8'), msg=bytes([t]), digestmod=hashlib.sha1)
    offset = hm.digest()[-1] & 0x0F
    value = (hm.digest()[offset] & 0x7F) << 24 | (hm.digest()[offset+1]) << 16 | (hm.digest()[offset+2]) << 8 | (hm.digest()[offset+3])
    return str(value)[-6:]
事件同步算法(HMAC-Based OTP,简称HOTP)

HOTP是基于哈希的一次性密码算法。它将计数器作为动态因素,每次生成一个与之对应的一次性密码。这样,在每次验证时,将输入的密码与服务器保存的对应密码进行比较,只有两者相等才能通过验证。

HOTP的实现方式分为以下几步:

  1. 客户端将计数器(Counter)发送给服务器,并保存在本地;
  2. 服务器利用随机种子和计数器计算出一次性密码,并返回给客户端;
  3. 客户端将一次性密码发送给服务器;
  4. 服务器利用相同的随机种子和计数器验证客户端发送的密码是否正确。

以下为Python代码片段,用于生成HOTP码:

import hmac
import hashlib

def generate_hotp(seed, counter):
    hm = hmac.new(seed.encode('utf-8'), msg=counter.to_bytes(8, byteorder='big'), digestmod=hashlib.sha1)
    offset = hm.digest()[-1] & 0x0F
    value = (hm.digest()[offset] & 0x7F) << 24 | (hm.digest()[offset+1]) << 16 | (hm.digest()[offset+2]) << 8 | (hm.digest()[offset+3])
    return str(value)[-6:]
结语

以上就是一次性密码的实现方式。不同的场景可以选择相应的算法来保证安全性,例如银行转账可能会选择TOTP算法,而网站登录则可能会选择HOTP算法。