Generated OTP using python3
tj_27
Posted on September 3, 2024
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:
đź’– đź’Ş đź™… đźš©
tj_27
Posted on September 3, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.