2fa(双因素身份验证) 是什么?应用场景和算法原理及实现

背景:

帮朋友眼镜下twitter的自动登陆,只用账号密码登陆比较容易但是账号被封的概率比较高。那么就需要寻找账号安全性更高的账号,那么就是多重认证登陆。账号多还需要境外的手机号,所以优选选择采购了。买的账号短信验证就不太可能,现在比较流行的就是2fa认证,这种账号确实相对好用,验证码是调用第三发网站实现的,不是很方便,就自己研究了一下应用场景和实现。

一. 2FA(双因素身份验证)是什么

双因素身份验证(2FA) 是一种安全机制,旨在通过要求用户提供两种不同形式的身份验证来增强账户的安全性。与传统的用户名和密码验证方式相比,2FA增加了额外的安全层,即使攻击者获取了用户的密码,也无法访问账户。

1.1  2FA的工作原理

2FA通常结合以下三种身份验证因素中的两种:

  1. 你所知道的:如密码、PIN码或安全问题的答案。

  2. 你所拥有的:如手机、硬件令牌(U盾)、智能卡等,这些设备可以生成或接收一次性验证码。

  3. 你是谁:如指纹、面部识别或视网膜扫描等生物特征。

1.2  2FA的常见实现方式

  • 短信验证码:用户在登录时接收短信中的验证码。

  • 身份验证应用:如Google Authenticator或Authy,生成基于时间的一次性密码(TOTP)。

  • 硬件令牌:如U盾或动态口令牌,生成一次性密码。

  • 生物识别:如指纹或面部识别。

1.3   2FA的优势

  1. 增强安全性:即使密码被泄露,攻击者也无法访问账户。

  2. 防范网络钓鱼:即使用户在钓鱼网站上泄露了密码,攻击者也无法绕过2FA。

  3. 减少凭证盗窃的影响:即使密码被盗,没有第二个因素也无法访问账户。

1.4   2FA与多因素身份验证(MFA)的区别

  • 2FA:仅需要两个身份验证因素。

  • MFA:可以使用两个或更多身份验证因素,提供更高的安全性。

二. 2FA(双因素身份验证)的实现算法

双因素身份验证(2FA)是一种增强安全性的身份验证机制,通过结合两种不同的身份验证因素(如密码和一次性验证码)来保护用户账户。以下是2FA中常见的实现算法及其工作原理:

2.1   基于时间的一次性密码(TOTP)

TOTP 是一种广泛使用的2FA实现算法,它基于时间生成动态验证码,每隔固定时间(通常是30秒)更新一次。其核心原理如下:

  • 密钥生成与分发:服务器生成一个随机的密钥,并将其安全地传递给用户的认证器应用(如Google Authenticator或Authy)。

  • 时间同步:客户端和服务端保持时间同步,通常使用协调世界时(UTC)。

  • 密码生成:客户端根据当前时间戳、共享密钥和哈希算法(如HMAC-SHA1)计算出一个一次性密码。

  • 验证:用户登录时,输入密码并提供认证器应用显示的一次性密码。服务器使用相同的密钥、时间戳和算法重新计算一次性密码,并与用户提供的密码进行比对。如果匹配,验证成功。

算法公式

plaintext复制

TOTP(K, C) = Truncate(HMAC-SHA-1(K, T/30))

其中:

  • K 是共享密钥。

  • T 是当前时间戳。

  • Truncate 是截取哈希值的算法,通常生成一个6位数字的验证码。

2.2    基于计数器的一次性密码(HOTP)

HOTP 是另一种2FA实现算法,基于计数器生成一次性密码。其工作原理如下:

  • 密钥生成与分发:服务器生成一个随机的密钥,并将其传递给用户的设备。

  • 密码生成:客户端根据共享密钥和一个递增的计数器值计算一次性密码。

  • 验证:用户登录时,输入密码和一次性密码,服务器验证其正确性。

算法公式

plaintext复制

HOTP(K, C) = Truncate(HMAC-SHA-1(K, C))

其中:

  • K 是共享密钥。

  • C 是递增的计数器值。

三. 在Python中实现2FA(双因素身份验证)算法

使用TOTP(基于时间的一次性密码)HOTP(基于计数器的一次性密码)。以下是基于这两种算法的Python实现示例。

3.1 使用 pyotp 库实现 TOTP 和 HOTP

pyotp 是一个流行的Python库,用于生成和验证一次性密码(OTP)。它支持 TOTP 和 HOTP 算法。

安装 pyotp

bash复制

pip install pyotp
示例代码:实现 TOTP

Python复制

import pyotp
import time

# 生成一个随机的密钥
secret_key ="D5KP7YBQFSATSVJN7Y25REODC7FKIEN2"
print(f"生成的密钥: {secret_key}")

# 创建一个 TOTP 对象
totp = pyotp.TOTP(secret_key)

# 获取当前时间的一次性密码
current_otp = totp.now()
print(f"当前的一次性密码: {current_otp}")

437305
如下网页实现的结果的数值是相同的。

示例代码:实现 HOTP

Python复制

import pyotp

# 生成一个随机的密钥
secret_key = pyotp.random_base32()
print(f"生成的密钥: {secret_key}")

# 创建一个 HOTP 对象
hotp = pyotp.HOTP(secret_key)

# 获取基于计数器的一次性密码
counter = 0
current_otp = hotp.at(counter)
print(f"当前的一次性密码: {current_otp}")

# 验证一次性密码
user_input = input("请输入您从认证器应用中获取的验证码: ")
if hotp.verify(user_input, counter):
    print("验证成功!")
else:
    print("验证失败!")

2. 使用 cryptography 库实现 TOTP

如果你不想使用 pyotp,也可以使用 cryptography 库来实现 TOTP 算法。以下是一个基于 cryptography 的 TOTP 实现示例。

安装 cryptography

bash复制

pip install cryptography
示例代码:实现 TOTP

Python复制

from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.hkdf import HKDF
from cryptography.hazmat.primitives.hmac import HMAC
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives import padding
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives.asymmetric import padding as asymmetric_padding
from cryptography.hazmat.primitives.asymmetric import utils as asymmetric_utils
from cryptography.hazmat.primitives.asymmetric import dsa
from cryptography.hazmat.primitives.asymmetric import ed25519
from cryptography.hazmat.primitives.asymmetric import x25519
from cryptography.hazmat.primitives.asymmetric import x448
from cryptography.hazmat.primitives.asymmetric import ed448
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives.asymmetric import dh
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives.asymmetric import padding as asymmetric_padding
from cryptography.hazmat.primitives.asymmetric import utils as asymmetric_utils
from cryptography.hazmat.primitives.asymmetric import dsa
from cryptography.hazmat.primitives.asymmetric import ed25519
from cryptography.hazmat.primitives.asymmetric import x25519
from cryptography.hazmat.primitives.asymmetric import x448
from cryptography.hazmat.primitives.asymmetric import ed448
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives.asymmetric import dh
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives.asymmetric import padding as asymmetric_padding
from cryptography.hazmat.primitives.asymmetric import utils as asymmetric_utils
from cryptography.hazmat.primitives.asymmetric import dsa
from cryptography.hazmat.primitives.asymmetric import ed25519
from cryptography.hazmat.primitives.asymmetric import x25519
from cryptography.hazmat.primitives.asymmetric import x448
from cryptography.hazmat.primitives.asymmetric import ed448
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives.asymmetric import dh
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives.asymmetric import padding as asymmetric_padding
from cryptography.hazmat.primitives.asymmetric import utils as asymmetric_utils
from cryptography.hazmat.primitives.asymmetric import dsa
from cryptography.hazmat.primitives.asymmetric import ed25519
from cryptography.hazmat.primitives.asymmetric import x25519
from cryptography.hazmat.primitives.asymmetric import x448
from cryptography.hazmat.primitives.asymmetric import ed448
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives.asymmetric import dh
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives.asymmetric import

猜你喜欢

转载自blog.csdn.net/liu_yueyang/article/details/145298391
今日推荐