from hashlib import sha256 import localtoken ''' Gerador: Primeira vez criar um usuário uma senha semente (Senha igual a registrada no servidor, senha principal) Um salt (o mesmo do Aplicativo) uma senha local (Senha para acesso ao gerador de senhas somente) Próximas vezes Digitar usuário e a senha local, se correto continua. Quando requisitado gera uma senha(Token). (algoritmo gerador de senhas) A senha (Token) deve ser gerada a partir da hash da senha semente do usuário (diferente da senha do usuário). O aluno deve propor uma variante do algoritmo OTP de Lamport, visto em aula. Este algoritmo deve levar em consideração o tempo (data hora minuto). As senhas devem ter validade de no máximo um minuto e só podem ser usadas uma única vez.(Fazer uma lista de senhas para ser usada no minuto. Ex.lista com 5 senhas para o minuto solicitado) somente gerar lista de senhas para o minuto solicitado. Servidor: Quando acessado usa o mesmo algoritmo gerador de senhas anterior. Mas em instância separada. A lista de senha gerada será a mesma nas duas partes, apesar de estarem em aplicativos separados e sem comunicação. Verifica o usuário e se senha digitada esta na lista gerada e não foi usada e nem invalidada. nesta caso apresenta “Chave válida”. Atenção: As senhas devem ter validade de no máximo um minuto e só podem ser usadas uma única vez. Senhas são geradas a partir de outras senhas, e se for usada uma chave todas as chaves geradas pela mesma devem ser invalidadas. Se o cliente digitar uma senha válida o servidor aceita, caso contrario retorna mensagem de erro. ''' USER = '' LOCAL_PASSWORD = '' SEED_PASSWORD = '' SALT = '' def check_setup(): try: with open('gerador.dat', 'r', newline='') as setup: lines = setup.readlines() if len(lines) != 4: return False USER = lines[0] LOCAL_PASSWORD = lines[1] SEED_PASSWORD = lines[2] SALT = lines[3] return True except: init_setup() return True def init_setup(): with open('gerador.dat', 'w', newline='') as setup: user = input('Digite o usuário: ') local_password = sha256(input('Digite a senha local: ').encode('utf-8')).hexdigest() seed_password = sha256(input('Digite a senha semente: ').encode('utf-8')).hexdigest() salt = sha256(input('Digite o salt: ').encode('utf-8')).hexdigest() setup.write(user + '\n') setup.write(local_password + '\n') setup.write(seed_password + '\n') setup.write(salt) def check_password(): local_password = sha256(input('Digite a senha local: ').encode('utf-8')).hexdigest() if local_password == LOCAL_PASSWORD: return True else: return False def generate_token(): token = localtoken.generate_token(SEED_PASSWORD, SALT) print('Token gerado: ' + token[:8]) def main(): if check_setup(): if check_password(): input('Pressione alguma tecla para gerar uma senha...') generate_token() else: print('Usuário ou senha incorretos!') else: print('Erro ao verificar setup!') if __name__ == '__main__': main()