Skip to main content

V2.8.4 One Time Verifier

Requirement:#

Verify that time-based OTP can be used only once within the validity period.

Explanation:#

ΠžΠ΄Π½ΠΎΡ€Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ Π½Π° основС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (TOTP) β€” это бСзопасный ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° Π² систСму. Код гСнСрируСтся Π½Π° основС Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ сСкрСтного ΠΊΠ»ΡŽΡ‡Π°, совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΈ сСрвСром. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ TOTP ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ срока дСйствия, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ чувствитСлСн ΠΊΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π‘Π΅Ρ€Π²Π΅Ρ€ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ TOTP Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ 30 ΠΈΠ»ΠΈ 60 сСкунд. По истСчСнии этого Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΊΠΎΠ΄ становится Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ. Π­Ρ‚Π° Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ практичСски Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС TOTP для Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠ°, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» Π΅Π³ΠΎ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, TOTP ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° Π² систСму, поэтому, Π΄Π°ΠΆΠ΅ Ссли Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊ смоТСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ TOTP Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ срока дСйствия, Π΅ΠΌΡƒ всС Ρ€Π°Π²Π½ΠΎ придСтся ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ TOTP для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π°. Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ TOTP эффСктивным способом Π·Π°Ρ‰ΠΈΡ‚Ρ‹ Π²Ρ…ΠΎΠ΄Π° Π² систСму ΠΈ прСдотвращСния нСсанкционированного доступа.

Remediation:#

Π§Ρ‚ΠΎΠ±Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ TOTP ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ срока ΠΈΡ… дСйствия, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ шаги:

  • ГСнСрация сСкрСтного ΠΊΠ»ΡŽΡ‡Π°. ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ шагом Π² процСссС TOTP являСтся гСнСрация сСкрСтного ΠΊΠ»ΡŽΡ‡Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ совмСстно ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΈ сСрвСром. Π­Ρ‚ΠΎΡ‚ сСкрСтный ΠΊΠ»ΡŽΡ‡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° TOTP для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° Π² систСму.
  • Π§ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ: TOTP Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½Π° основС Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ сСкрСтного ΠΊΠ»ΡŽΡ‡Π°. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π½Ρ‹ΠΌ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° Π² систСму, Π΄Π°ΠΆΠ΅ Ссли сСкрСтный ΠΊΠ»ΡŽΡ‡ останСтся ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΌ. Код дСйствитСлСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ 30 ΠΈΠ»ΠΈ 60 сСкунд, послС Ρ‡Π΅Π³ΠΎ ΠΎΠ½ становится Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ.
  • ΠŸΠ΅Ρ€ΠΈΠΎΠ΄ дСйствия: ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ дСйствия β€” это ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΊΠΎΠ΄ TOTP считаСтся Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ. По истСчСнии срока дСйствия ΠΊΠΎΠ΄ нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ. Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ практичСски Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС TOTP для Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠ°, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» Π΅Π³ΠΎ.
  • ГСнСрация ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°: TOTP ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° Π² систСму, поэтому, Π΄Π°ΠΆΠ΅ Ссли Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊ смоТСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ TOTP Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ срока дСйствия, Π΅ΠΌΡƒ всС Ρ€Π°Π²Π½ΠΎ придСтся ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ TOTP для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π°. Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ TOTP эффСктивным способом Π·Π°Ρ‰ΠΈΡ‚Ρ‹ Π²Ρ…ΠΎΠ΄Π° Π² систСму ΠΈ прСдотвращСния нСсанкционированного доступа.Β 

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, TOTP ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ срока ΠΈΡ… дСйствия, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½Π° основС Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ сСкрСтного ΠΊΠ»ΡŽΡ‡Π° ΠΈ становятся Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠΎ истСчСнии ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π­Ρ‚Π° Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² сочСтании с ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ процСссом Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° Π΄Π΅Π»Π°Π΅Ρ‚ TOTP эффСктивным ΠΈ бСзопасным ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΎΠ΄Π½ΠΎΡ€Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ пароля Π½Π° основС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (TOTP) Π² Python:

import pyotp
import time
# Generate a secret key
secret_key = pyotp.random_base32()
# Generate a TOTP object using the secret key
totp = pyotp.TOTP(secret_key)
# Get the current TOTP code
current_code = totp.now()
# Verify the TOTP code entered by the user
def verify_code(user_code):
# Check if the user code is valid within the time-based validity period (typically 30 or 60 seconds)
if totp.verify(user_code):
print("TOTP code is valid")
else:
print("TOTP code is invalid")
# Example usage
user_code = input("Enter TOTP code: ")
verify_code(user_code)

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° pyotp ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΊΠΎΠ΄Π° TOTP. secret_key гСнСрируСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° random_base32(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ случайный сСкрСтный ΠΊΠ»ΡŽΡ‡ Π² ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅ base32. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ TOTP создаСтся с использованиСм сСкрСтного ΠΊΠ»ΡŽΡ‡Π°, Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ TOTP гСнСрируСтся с использованиСм ΠΌΠ΅Ρ‚ΠΎΠ΄Π° now(). Ѐункция verify_code ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΊΠΎΠ΄Π° TOTP, Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ verify () ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΎΠ³ΠΎ, дСйствитСлСн Π»ΠΈ ΠΊΠΎΠ΄ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° дСйствия, основанного Π½Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Additional:#