# # Requirements: argon2-cffi # import argon2 import argparse import getpass import sys # # WARNING: Changing any of the parameters below will affect password generation # # Default SALT to use; this cannot be random since passgeny must # generate predictable passwords PASSGENY_SALT_DEFAULT = b"Passgeny v1" # Memory cost expresssed in kb PASSGENY_ARGON2_MEMORY_COST = 8192 # Number of iterations PASSGENY_ARGON2_TIME_COST = 6 # Number of parallel threads PASSGENY_ARGON2_PARALLEL = 4 # Hash length - 512 bits by default PASSGENY_ARGON2_HASH_LEN = 64 def argon2_hash(message): return argon2.low_level.hash_secret_raw( message, PASSGENY_SALT_DEFAULT, type = argon2.Type.ID, memory_cost = PASSGENY_ARGON2_MEMORY_COST, time_cost = PASSGENY_ARGON2_TIME_COST, parallelism = PASSGENY_ARGON2_PARALLEL, hash_len = PASSGENY_ARGON2_HASH_LEN) def passgeny_hash(master_password, token_list): message = b'' # Construct the message to be hashed for x in token_list: message += x.encode() + b'\0' message += master_password.encode() + b'\0' return argon2_hash(message) mpw = getpass.getpass("Master password: ") print(passgeny_hash(mpw, ("1", "2", "3")))