Skip to content

atomjoy/2FACode

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

23 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

2FACode Generator

C# 2FA code generator from json (Two-Factor Codes).

Libs

  • Newtonsoft.Json
  • Otp.NET

Json secrets

secrets\secrets.json

[ { "name": "Social", "code": "47CMX5QK6BRJR4AFZ5C2NVG" }, { "name": "Mail", "code": "B7PZCSD7K4AG4WX7WQEJVIE5FFCZB6" } ]

Console app

Create json file with secrets in app dir secrets\secrets.json

using Newtonsoft.Json; using OtpNet; using System; using System.IO; using System.Threading; using System.Threading.Tasks; namespace MyApp { public class Item { public string name = ""; public string code = ""; } class Program { static void Main(string[] args) { // Random hash var key = KeyGeneration.GenerateRandomKey(20); var base32String = Base32Encoding.ToString(key); Console.WriteLine("Random {0}", base32String); Console.WriteLine("-------------------------------------"); // From JSON using StreamReader r = new(@"secrets\secrets.json"); string? json = r.ReadToEnd(); if (json != null) { List<Item>? items = JsonConvert.DeserializeObject<List<Item>>(json); while (true) { dynamic? array = JsonConvert.DeserializeObject(json) ?? new List<Object>(); foreach (var item in array) { string itemName = item.name; string itemCode = item.code; var otpCode = new Totp(Base32Encoding.ToBytes(itemCode)).ComputeTotp(DateTime.UtcNow); Console.WriteLine("{0}", DateTime.UtcNow.ToString()); Console.WriteLine("===> {0}", itemName); Console.WriteLine("======> {0}", otpCode); Console.WriteLine("----------------------------------------"); } Thread.Sleep(15000); // 30 second delay Console.Clear(); } } Console.WriteLine("\nPress any key to exit."); Console.ReadKey(); } } }