Heim  >  Artikel  >  Backend-Entwicklung  >  Generiertes OTP mit Python3

Generiertes OTP mit Python3

WBOY
WBOYOriginal
2024-09-03 17:03:02853Durchsuche

Since we were not allowed to have MFA together with the same application we are using, I got an idea from my leader to just have a generated OTPs.

import time
import hmac
import base64
import struct
import hashlib

def generate_otp(secret, interval=30, digits=6):
    # Decode the base32 encoded secret
    key = base64.b32decode(secret)

    # Calculate the number of time intervals since the Unix epoch
    counter = int(time.time()) // interval

    # Convert the counter to bytes
    msg= struct.pack(">Q", counter)

    # Create the HMAC hash using SHA-1
    hmac_hash = hmac.new(key, msg, hashlib.sha1).digest()

    # Get the dynamic offset from the last nibble of the hash
    offset = hmac_hash[-1] & 0x0F

    # Extract a 4-byte dynamic binary code form the hash using the offset
    code = struct.unpack(">I", hmac_hash[offset:offset + 4]) [0] & 0x7FFFFFFF

    # Modulus operation to get the final OTP
    otp = code % (10 ** digits)

    return str(otp).zfill(digits)

# Lists for secret keys and remarks
secret_keys_with_titles = {
    "[name]": "[secret_key]",
    "VAR": "ABDCDEFGHIJKLMNO",
    "VER": "PQRSTUVWXYZ12345",
    "VIR": "6789101112131415"
}

# ANSI escape codes for different color
colors = [
    "\033[91m", # Red
    "\033[92m", # Green
    "\033[94m", # Blue
    "\033[93m", # Yellow
    "\033[96m", # Cyan
]
print()
# Generate the OTPs for all secret keys
otps = {title: generate_otp(secret) for title, secret in secret_keys_with_titles.items()}

# Output the OTPs in horizontal way
output = []
for i, (title, otp) in enumerate(otps.items()):
    color = colors[i % len(colors)] # Rotate through colors
    output.append(f"{color}{title}: {otp}\033[0m") #\033[0m resets the color

print(" | ".join(output))
print()

So, this is how it look on your terminal:

Generated OTP using python3

Das obige ist der detaillierte Inhalt vonGeneriertes OTP mit Python3. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn