Skip to content

ITAXBOX/ft_otp---Advanced-TOTP-Authenticator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

21 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ” FT_OTP - Time-Based One-Time Password Generator

42 Score Java License TOTP

A professional, secure, and feature-rich Time-Based One-Time Password (TOTP) implementation for 42 School's Cybersecurity Piscine project.

This project achieved 125/100 at 42 Beirut, demonstrating excellence in cryptographic implementation, code quality, and user experience design.


πŸ“‹ Table of Contents


✨ Features

Core Functionality

  • πŸ”‘ Secure Key Generation - Generates encrypted key files from hexadecimal seeds
  • ⏱️ TOTP Generation - RFC 6238 compliant time-based OTP codes
  • πŸ“± QR Code Support - Beautiful terminal QR codes for mobile authenticator apps
  • πŸ–₯️ Dual Interface - Both CLI and GUI modes available
  • 🎨 Beautiful UI - Colorful terminal output and modern GUI design

Security Features

  • πŸ”’ AES-256-GCM Encryption - Military-grade encryption for key storage
  • πŸ›‘οΈ PBKDF2 Key Derivation - 150,000 iterations for strong password protection
  • 🧹 Memory Wiping - Sensitive data cleared immediately after use
  • πŸ” AEAD Authentication - Authenticated encryption prevents tampering
  • 🎲 Secure Random - Cryptographically secure random number generation

Compatibility

  • βœ… Google Authenticator
  • βœ… Microsoft Authenticator
  • βœ… Authy
  • βœ… Any RFC 6238 compliant TOTP app

🎬 Demo

Step 1: Generate Encrypted Key

Generate a secure key file from a 64-character hexadecimal seed:

./ft_otp -g key.txt

Generate Key

What happens:

  • Reads hexadecimal seed (minimum 64 characters)
  • Prompts for passphrase (with confirmation)
  • Encrypts seed using AES-256-GCM
  • Saves encrypted key to ft_otp.key

Step 2: Generate OTP Code

Generate a time-based one-time password (valid for 30 seconds):

./ft_otp -k ft_otp.key

Generate OTP

What happens:

  • Decrypts the key file using your passphrase
  • Calculates current time counter (epoch / 30)
  • Generates 6-digit HMAC-based code
  • Displays OTP in beautiful formatted box

Step 3: Display QR Code

Show QR code for scanning with mobile authenticator apps:

./ft_otp -q ft_otp.key

QR Code

What happens:

  • Decrypts key file
  • Generates TOTP URI (otpauth://totp/...)
  • Renders QR code using Unicode characters
  • Displays account information and setup details

Bonus: GUI Mode

Launch the beautiful graphical interface:

./ft_otp -gui

GUI Application

Features:

  • πŸ“ File browser for easy key file selection
  • πŸ”‘ Key generation with live validation
  • πŸ“± QR code display in window
  • 🎨 Modern, user-friendly design
  • ⚑ Real-time feedback and error handling

πŸ”’ Security Architecture

Encryption Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    KEY GENERATION (-g)                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                            β”‚
                            β–Ό
              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
              β”‚  Read Hex Seed (64+)    β”‚
              β”‚  e.g., 48656c6c6f21...  β”‚
              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                            β”‚
                            β–Ό
              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
              β”‚  Get User Passphrase    β”‚
              β”‚  (Double confirmation)  β”‚
              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                            β”‚
                            β–Ό
      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
      β”‚         PBKDF2-HMAC-SHA256              β”‚
      β”‚  β€’ 150,000 iterations                   β”‚
      β”‚  β€’ 16-byte random salt                  β”‚
      β”‚  β€’ 256-bit derived key                  β”‚
      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                        β”‚
                        β–Ό
      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
      β”‚         AES-256-GCM Encryption          β”‚
      β”‚  β€’ 12-byte random IV                    β”‚
      β”‚  β€’ 128-bit authentication tag           β”‚
      β”‚  β€’ AAD: "FTOTP1" magic string           β”‚
      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                        β”‚
                        β–Ό
              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
              β”‚  Save to ft_otp.key     β”‚
              β”‚  (Base64 encoded)       β”‚
              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    OTP GENERATION (-k)                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                            β”‚
                            β–Ό
              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
              β”‚  Read ft_otp.key file   β”‚
              β”‚  Parse parameters       β”‚
              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                            β”‚
                            β–Ό
              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
              β”‚  Get User Passphrase    β”‚
              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                            β”‚
                            β–Ό
      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
      β”‚         Derive Key (PBKDF2)             β”‚
      β”‚  Using stored salt & iterations         β”‚
      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                        β”‚
                        β–Ό
      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
      β”‚      AES-256-GCM Decryption             β”‚
      β”‚  β€’ Verify authentication tag            β”‚
      β”‚  β€’ Decrypt seed                         β”‚
      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                        β”‚
                        β–Ό
              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
              β”‚  Calculate Counter      β”‚
              β”‚  time = epoch / 30      β”‚
              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                            β”‚
                            β–Ό
      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
      β”‚         HOTP (RFC 4226)                 β”‚
      β”‚  β€’ HMAC-SHA1(seed, counter)             β”‚
      β”‚  β€’ Dynamic truncation                   β”‚
      β”‚  β€’ Modulo 1,000,000 (6 digits)          β”‚
      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                        β”‚
                        β–Ό
              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
              β”‚  Display 6-digit OTP    β”‚
              β”‚  Valid for 30 seconds   β”‚
              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Key Security Features

Feature Implementation Purpose
Encryption AES-256-GCM Industry-standard authenticated encryption
Key Derivation PBKDF2-HMAC-SHA256 Slow key derivation resistant to brute force
Iterations 150,000 Makes password cracking computationally expensive
Salt 16 bytes random Prevents rainbow table attacks
IV 12 bytes random Ensures encryption uniqueness
Authentication Tag 128-bit GCM tag Detects tampering or corruption
Memory Wiping Arrays.fill() Prevents secrets in memory dumps
AAD "FTOTP1" magic Additional authentication data

πŸš€ Installation

Prerequisites

  • Java JDK 11+ - Download here
  • Make - Build automation tool
  • curl - For downloading ZXing library (QR codes)
  • WSL/Linux/macOS - Unix-like environment

Quick Start

# Clone the repository
git clone https://github.com/ITAXBOX/ft_otp.git
cd ft_otp

# Download required libraries (ZXing for QR codes)
./download-libs.sh

# Build the project
make

# Verify installation
./ft_otp

Manual Library Download

If the automatic download fails:

# Create lib directory
mkdir -p lib

# Download ZXing Core
curl -L -o lib/core-3.5.3.jar \
  https://repo1.maven.org/maven2/com/google/zxing/core/3.5.3/core-3.5.3.jar

# Download ZXing JavaSE
curl -L -o lib/javase-3.5.3.jar \
  https://repo1.maven.org/maven2/com/google/zxing/javase/3.5.3/javase-3.5.3.jar

# Build
make

πŸ“– Usage

CLI Mode

1. Generate Key File

./ft_otp -g <hex_key_file>

Example:

# Create a hex key file (minimum 64 characters)
echo "48656c6c6f21deadbeef48656c6c6f21deadbeef48656c6c6f21deadbeef48656c6c6f21deadbeef" > key.txt

# Generate encrypted key
./ft_otp -g key.txt
# Enter passphrase: ********
# Confirm passphrase: ********
# βœ“ Key was successfully saved in ft_otp.key

Requirements:

  • Hex file must contain at least 64 hexadecimal characters (0-9, A-F)
  • Passphrase is required and must be confirmed
  • Output file is always ft_otp.key

2. Generate OTP Code

./ft_otp -k <key_file>

Example:

./ft_otp -k ft_otp.key
# Enter passphrase: ********
#
# ╔══════════════════════════════════════╗
# β•‘         YOUR OTP CODE                β•‘
# ╠══════════════════════════════════════╣
# β•‘            123456                    β•‘
# β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•
#   ⏱  Valid for 30 seconds

Usage Tips:

  • Code changes every 30 seconds
  • Use within the validity window
  • Must match the code on authenticator apps

3. Display QR Code

./ft_otp -q <key_file>

Example:

./ft_otp -q ft_otp.key
# Enter passphrase: ********
# [Displays beautiful QR code with account information]

Scanning Instructions:

  1. Open your authenticator app (Google Authenticator, Authy, etc.)
  2. Select "Add account" β†’ "Scan QR code"
  3. Point camera at the terminal QR code
  4. Account will be added automatically

GUI Mode

Launch GUI

./ft_otp -gui

GUI Features:

  1. Generate Key Tab

    • Browse for hex key file
    • Enter passphrase with confirmation
    • Visual feedback on success
    • Automatic key file creation
  2. Get OTP Tab

    • Browse for key file
    • Enter passphrase
    • Display OTP in large, readable format
    • Copy to clipboard functionality
  3. QR Code Tab

    • Browse for key file
    • Enter passphrase
    • Display QR code in window
    • Show account information
    • Save QR code as image

πŸ”§ Technical Implementation

Project Architecture

ft_otp/
β”œβ”€β”€ src/
β”‚   └── com/
β”‚       └── ftotp/
β”‚           β”œβ”€β”€ Main.java                 # Entry point
β”‚           β”œβ”€β”€ core/
β”‚           β”‚   └── FtOtp.java           # Core OTP logic
β”‚           β”œβ”€β”€ crypto/
β”‚           β”‚   β”œβ”€β”€ Crypto.java          # AES-GCM, PBKDF2
β”‚           β”‚   β”œβ”€β”€ KeyFile.java         # Key file handling
β”‚           β”‚   └── Params.java          # Crypto parameters
β”‚           β”œβ”€β”€ hotp/
β”‚           β”‚   └── HOTP.java            # RFC 4226 implementation
β”‚           β”œβ”€β”€ qr/
β”‚           β”‚   └── TerminalQRRenderer.java  # QR code rendering
β”‚           β”œβ”€β”€ uri/
β”‚           β”‚   └── OtpUri.java          # TOTP URI builder
β”‚           β”œβ”€β”€ ui/
β”‚           β”‚   β”œβ”€β”€ Colors.java          # ANSI colors
β”‚           β”‚   └── TerminalUI.java      # CLI UI components
β”‚           β”œβ”€β”€ gui/
β”‚           β”‚   β”œβ”€β”€ FtOtpGUI.java        # Main GUI window
β”‚           β”‚   β”œβ”€β”€ GenerateKeyPanel.java    # Key generation panel
β”‚           β”‚   β”œβ”€β”€ GetOTPPanel.java     # OTP display panel
β”‚           β”‚   └── QRCodePanel.java     # QR code panel
β”‚           β”œβ”€β”€ util/
β”‚           β”‚   β”œβ”€β”€ Constants.java       # Application constants
β”‚           β”‚   └── Hex.java             # Hex utilities
β”‚           └── exception/
β”‚               β”œβ”€β”€ UserException.java   # User-facing errors
β”‚               └── InvalidKeyFileException.java
β”œβ”€β”€ lib/
β”‚   β”œβ”€β”€ core-3.5.3.jar                   # ZXing core
β”‚   └── javase-3.5.3.jar                 # ZXing JavaSE
β”œβ”€β”€ Makefile                             # Build automation
β”œβ”€β”€ download-libs.sh                     # Library downloader
└── README.md                            # This file

Key Classes

FtOtp.java - Core Logic

public class FtOtp {
    // Generate encrypted key file
    public static void generate(String hexKeyPath)
    
    // Generate OTP code
    public static void printOtp(String keyFilePath)
    
    // Display QR code
    public static void displayQRCode(String keyFilePath)
}

HOTP.java - RFC 4226 Implementation

public class HOTP {
    // Generate HMAC-based OTP
    public static int generate(byte[] key, long counter, String hmacAlg)
}

Crypto.java - Cryptographic Operations

public class Crypto {
    // PBKDF2 key derivation
    public static byte[] deriveKey(char[] pass, byte[] salt, int iterations, int keyLenBytes)
    
    // AES-GCM encryption
    public static byte[] aesGcmEncrypt(byte[] key, byte[] iv, byte[] plaintext, byte[] aad)
    
    // AES-GCM decryption
    public static byte[] aesGcmDecrypt(byte[] key, byte[] iv, byte[] ciphertext, byte[] aad)
}

Constants Configuration

Located in Constants.java:

// OTP Parameters
DEFAULT_OTP_DIGITS = 6           // 6-digit codes
DEFAULT_TIMESTEP_SECONDS = 30    // 30-second validity
DEFAULT_HMAC_ALGORITHM = "HmacSHA1"

// Cryptography
DEFAULT_PBKDF2_ITERATIONS = 150_000  // 150k iterations
DEFAULT_AES_KEY_BYTES = 32           // 256-bit AES
SALT_LENGTH_BYTES = 16               // 128-bit salt
IV_LENGTH_BYTES = 12                 // 96-bit IV
GCM_TAG_LENGTH_BITS = 128            // 128-bit auth tag

// QR Code
QR_CODE_SIZE = 50                    // Terminal QR size
DEFAULT_OTP_ISSUER = "ft_otp"
DEFAULT_OTP_LABEL = "aitawi"

πŸ“‚ Project Structure

Build System

Makefile:

JAVA := javac
JFLAGS := --release 11
OUT := out
MAIN := com.ftotp.Main
WRAP := ft_otp
LIB := lib
CP := $(LIB)/core-3.5.3.jar:$(LIB)/javase-3.5.3.jar

all: $(WRAP)

$(WRAP): compile
    @echo '#!/bin/sh' > $(WRAP)
    @echo 'exec java -cp $(OUT):$(CP) $(MAIN) "$$@"' >> $(WRAP)
    @chmod +x $(WRAP)

compile:
    @mkdir -p $(OUT)
    @find src -name '*.java' | xargs $(JAVA) $(JFLAGS) -cp $(CP) -d $(OUT)

fclean:
    @rm -rf $(OUT) $(WRAP)

File Format

ft_otp.key format:

FTOTP1                          # Magic header
6                               # Digits
30                              # Period (seconds)
HmacSHA1                        # Algorithm
150000                          # PBKDF2 iterations
32                              # AES key size
<base64_salt>                   # 16 bytes
<base64_iv>                     # 12 bytes
<base64_ciphertext>             # Encrypted seed + tag

πŸ“œ RFC Compliance

Implemented RFCs

RFC Title Implementation
RFC 4226 HOTP: An HMAC-Based One-Time Password Algorithm βœ… Full compliance in HOTP.java
RFC 6238 TOTP: Time-Based One-Time Password Algorithm βœ… Full compliance in FtOtp.java
RFC 4648 Base32/Base64 Encoding βœ… Used for secret encoding in QR codes
RFC 5869 HKDF (via PBKDF2) βœ… Key derivation in Crypto.java

TOTP URI Format

Following Google Authenticator Key URI Format:

otpauth://totp/LABEL?secret=BASE32SECRET&issuer=ISSUER&algorithm=SHA1&digits=6&period=30

Example:

otpauth://totp/aitawi?secret=JBSWY3DPEHPK3PXP&issuer=ft_otp&algorithm=SHA1&digits=6&period=30

πŸŽ“ Educational Value

Learning Outcomes

This project demonstrates proficiency in:

  1. Cryptography

    • Symmetric encryption (AES-GCM)
    • Key derivation (PBKDF2)
    • Message authentication codes (HMAC)
    • Secure random number generation
  2. Security Principles

    • Defense in depth
    • Secure key storage
    • Memory security
    • Authentication vs Encryption
  3. Software Engineering

    • Clean code architecture
    • Single responsibility principle
    • Proper error handling
    • User experience design
  4. Standards Compliance

    • RFC implementation
    • Industry best practices
    • Interoperability

42 Project Requirements

βœ… All mandatory requirements met:

  • Generate encrypted key from hex file
  • Store key securely with password
  • Generate TOTP codes
  • Proper error handling
  • Code quality and norminette compliance

🌟 Bonus features implemented:

  • QR code generation
  • Beautiful terminal UI
  • GUI application
  • Enhanced security (AES-256 instead of AES-128)
  • Multiple authenticator app support

πŸ† Project Score: 125/100

Evaluation Highlights

Mandatory (100 points):

  • βœ… Key generation from hex file
  • βœ… Secure encryption with password
  • βœ… TOTP generation
  • βœ… Proper error handling
  • βœ… Clean code structure

Bonus (25 points):

  • βœ… QR code generation (+10)
  • βœ… Beautiful UI/UX (+5)
  • βœ… GUI mode (+5)
  • βœ… Enhanced security (+5)

πŸ‘¨β€πŸ’» Author

Ali Itawi


πŸ“„ License

This project is part of the 42 School curriculum and is intended for educational purposes.


πŸ™ Acknowledgments

  • 42 Beirut - For the excellent cybersecurity curriculum
  • ZXing Project - For the QR code library
  • RFC Authors - For the detailed specifications
  • Security Community - For best practices and standards

πŸ“š References


🌟 If you found this project helpful, please consider giving it a star! 🌟

Made with ❀️ and β˜• at 42 Beirut

About

TOTP implementation with modern cryptography, beautiful UI/UX, and mobile authenticator integration

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published