From 9fafd82b5cbbf3487a142e2d3ea97a1fe50df1d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Henrique?= Date: Mon, 11 Sep 2023 17:30:47 -0300 Subject: [PATCH] coisas --- trabalho2/gerador.py | 71 ++++++++++++++++++++++++++--------------- trabalho2/localtoken.py | 7 ++++ trabalho2/server.py | 25 ++++++++++++++- 3 files changed, 76 insertions(+), 27 deletions(-) create mode 100644 trabalho2/localtoken.py diff --git a/trabalho2/gerador.py b/trabalho2/gerador.py index e3db124..4853acf 100644 --- a/trabalho2/gerador.py +++ b/trabalho2/gerador.py @@ -1,20 +1,33 @@ from hashlib import sha256 +import localtoken ''' -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. +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 = '' @@ -27,11 +40,12 @@ def check_setup(): with open('gerador.dat', 'r', newline='') as setup: lines = setup.readlines() if len(lines) != 4: - init_setup() - return True + return False USER = lines[0] LOCAL_PASSWORD = lines[1] + SEED_PASSWORD = lines[2] + SALT = lines[3] return True except: init_setup() @@ -40,26 +54,31 @@ def check_setup(): def init_setup(): with open('gerador.dat', 'w', newline='') as setup: - user = input('Digite o nome de usuário: ') - password = sha256(input('Digite a senha local: ').encode('utf-8')).hexdigest() - setup.write(USER + '\n') - setup.write(LOCAL_PASSWORD) + 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(): - user = input('Digite o nome de usuário: ') - password = input('Digite a senha local: ') - if user == USER and password == LOCAL_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_password(): - input('Pressione alguma tecla para gerar uma senha...') +def generate_token(): + token = localtoken.generate_token(SEED_PASSWORD, SALT) + print('Token gerado: ' + token[:8]) def main(): if check_setup(): if check_password(): - generate_password() + input('Pressione alguma tecla para gerar uma senha...') + generate_token() else: print('Usuário ou senha incorretos!') else: diff --git a/trabalho2/localtoken.py b/trabalho2/localtoken.py new file mode 100644 index 0000000..f82861e --- /dev/null +++ b/trabalho2/localtoken.py @@ -0,0 +1,7 @@ +from hashlib import sha256 +import time + +# password = hashed password +def generate_token(password, salt): + time = time.strftime('%d%m%Y%H%M') + token = sha256((password + salt + time).encode('utf-8')).hexdigest() \ No newline at end of file diff --git a/trabalho2/server.py b/trabalho2/server.py index cf3d99c..f398fd6 100644 --- a/trabalho2/server.py +++ b/trabalho2/server.py @@ -1,3 +1,6 @@ +from hashlib import sha256 +import localtoken + ''' 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. @@ -8,4 +11,24 @@ Quando acessado usa o mesmo algoritmo gerador de senhas anterior. Mas em instân 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. -''' \ No newline at end of file +''' + +SALT = '' +PASSWORD = '' + +def main(): + print('Servidor!') + SALT = sha256(input('Digite o salt: ').encode('utf-8')).hexdigest() + PASSWORD = sha256(input('Digite a senha: ').encode('utf-8')).hexdigest() + + while True: + token = input('Digite o token: ') + if localtoken.generate_token(PASSWORD, SALT)[:8] == token[:8]: + print('Chave válida!') + else: + print('Chave inválida!') + + + +if __name__ == '__main__': + main() \ No newline at end of file