import json import random from jsonrpcclient import Request from jsonrpcclient.http_client import HTTPClient from contextlib import contextmanager import sys, os import argparse #argparse parser = argparse.ArgumentParser(prog='True Random Password Generator', description='Uses the random.org basic API with a free subscription to initialize a true random seed for the python random function to create -c passwords of -l length') parser.add_argument('-a', '--apikey', default=os.environ['HOME']+'/.bin/.apikey' , type=str, help='path to a file which contains only a random.org api key') parser.add_argument('-c', '--count', default='50', type=int, help='the number of passwords to generate') parser.add_argument('-l', '--length', default='20', type=int, help='the length the generated passwords should have') parser.add_argument('-s', '--seed', action='store_true', help='outputs the queried seed instead of initialzing the pseudo random vector') args = parser.parse_args() #Loading the .apikey file try: with open (args.apikey, 'r') as f: apikey=f.readline() except: print("Please provide a file that contains only your apikey with the -a option, if no option is provided the script assumes that the apikey file has this path: " + args.apikey) exit(1) #Prevent program segments from blabbering to stdout/stderr @contextmanager def suppress_std_err_out(): with open(os.devnull, "w") as devnull: old_stdout = sys.stdout sys.stdout = devnull old_stderr = sys.stderr sys.stderr = devnull try: yield finally: sys.stdout = old_stdout sys.stderr = old_stderr #Blabbering program segment with suppress_std_err_out(): client = HTTPClient("https://api.random.org/json-rpc/2/invoke") response = client.send(Request("generateIntegers", apiKey=apikey,n="1",min='1',max="1000000000")) seed=response["random"]["data"] #Filling the seed with a (true) random number if not args.seed: characters="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789#_@!?+" char_lst = [x for x in characters] random.seed(int(seed[0])) #Building password for _ in range(0,args.count): pw_string="" for _ in range(0,args.length): pw_string += char_lst[random.randint(0, 67)] print(pw_string) else: print("-------------------------------------------") print('Seed: '+str(seed[0])); print("-------------------------------------------") bit_uses_left=response["bitsLeft"] // response["bitsUsed"] uses_left = bit_uses_left if bit_uses_left < response["requestsLeft"] else response["requestsLeft"] print("This apikey (with free api subscription) has another " + str(uses_left) + " uses left today")