This commit is contained in:
José Henrique 2023-09-11 17:30:47 -03:00
parent 4ebf1edfe2
commit 9fafd82b5c
3 changed files with 76 additions and 27 deletions

View File

@ -1,20 +1,33 @@
from hashlib import sha256 from hashlib import sha256
import localtoken
''' '''
Primeira vez criar Gerador:
um usuário Primeira vez criar
uma senha semente (Senha igual a registrada no servidor, senha principal) um usuário
Um salt (o mesmo do Aplicativo) uma senha semente (Senha igual a registrada no servidor, senha principal)
uma senha local (Senha para acesso ao gerador de senhas somente) Um salt (o mesmo do Aplicativo)
Próximas vezes uma senha local (Senha para acesso ao gerador de senhas somente)
Digitar usuário e a senha local, se correto continua. Próximas vezes
Quando requisitado gera uma senha(Token). Digitar usuário e a senha local, se correto continua.
(algoritmo gerador de senhas) Quando requisitado gera uma senha(Token).
A senha (Token) deve ser gerada a partir da hash da senha semente do usuário (diferente da senha do usuário). (algoritmo gerador de senhas)
O aluno deve propor uma variante do algoritmo OTP de Lamport, visto em aula. A senha (Token) deve ser gerada a partir da hash da senha semente do usuário (diferente da senha do usuário).
Este algoritmo deve levar em consideração o tempo (data hora minuto). O aluno deve propor uma variante do algoritmo OTP de Lamport, visto em aula.
As senhas devem ter validade de no máximo um minuto e 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) Este algoritmo deve levar em consideração o tempo (data hora minuto).
somente gerar lista de senhas para o minuto solicitado. As senhas devem ter validade de no máximo um minuto e 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 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 = '' USER = ''
@ -27,11 +40,12 @@ def check_setup():
with open('gerador.dat', 'r', newline='') as setup: with open('gerador.dat', 'r', newline='') as setup:
lines = setup.readlines() lines = setup.readlines()
if len(lines) != 4: if len(lines) != 4:
init_setup() return False
return True
USER = lines[0] USER = lines[0]
LOCAL_PASSWORD = lines[1] LOCAL_PASSWORD = lines[1]
SEED_PASSWORD = lines[2]
SALT = lines[3]
return True return True
except: except:
init_setup() init_setup()
@ -40,26 +54,31 @@ def check_setup():
def init_setup(): def init_setup():
with open('gerador.dat', 'w', newline='') as setup: with open('gerador.dat', 'w', newline='') as setup:
user = input('Digite o nome de usuário: ') user = input('Digite o usuário: ')
password = sha256(input('Digite a senha local: ').encode('utf-8')).hexdigest() local_password = sha256(input('Digite a senha local: ').encode('utf-8')).hexdigest()
setup.write(USER + '\n') seed_password = sha256(input('Digite a senha semente: ').encode('utf-8')).hexdigest()
setup.write(LOCAL_PASSWORD) 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(): def check_password():
user = input('Digite o nome de usuário: ') local_password = sha256(input('Digite a senha local: ').encode('utf-8')).hexdigest()
password = input('Digite a senha local: ') if local_password == LOCAL_PASSWORD:
if user == USER and password == LOCAL_PASSWORD:
return True return True
else: else:
return False return False
def generate_password(): def generate_token():
input('Pressione alguma tecla para gerar uma senha...') token = localtoken.generate_token(SEED_PASSWORD, SALT)
print('Token gerado: ' + token[:8])
def main(): def main():
if check_setup(): if check_setup():
if check_password(): if check_password():
generate_password() input('Pressione alguma tecla para gerar uma senha...')
generate_token()
else: else:
print('Usuário ou senha incorretos!') print('Usuário ou senha incorretos!')
else: else:

7
trabalho2/localtoken.py Normal file
View File

@ -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()

View File

@ -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. 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. 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. 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. Se o cliente digitar uma senha válida o servidor aceita, caso contrario retorna mensagem de erro.
''' '''
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()