PT-BR/passwordHash

From Multi Theft Auto: Wiki
Jump to navigation Jump to search

Post-it.png Nota: Using passwordHash é o meio recomendado para guardar senhas.

Esta função cria um hash a partir de uma senha especificada (basicamente, a senha criptografada) usando um algorítmo específico de hashing.



[[|link=|]] Aviso: É altamente recomendado usar a versão assíncrona desta função (especificando a função callback). Por outro lado, você pode sofrer algumas travadas devido à lentidão do algoritmo bcrypt.

Sintaxe

string passwordHash ( string password, string algorithm, table options [, function callback ] )  

Argumentos necessários

  • password: A senha para criptografar.
  • algorithm: O algoritmo para usar:
    • bcrypt: usa o algoritmo de criptografia bcrypt. Tamanho do hash: 60 caracteres. Note que apenas o prefixo $2y$ é suportado (prefixos antigos podem causar problemas de segurança).
  • options: tabela com opções para o algoritmo de criptografia, detalhados abaixo.

Argumentos opcionais

  • callback: especificando uma função callback vai fazer com que esta função funcione de forma assíncrona, os parâmetros da função callback são o mesmo dos valores retornados abaixo.


Opções para cada algoritmo de criptografia

  • bcrypt:
    • cost (int), padrão: 10. Veja este link para determinar o número de voltas apropriadas para seu servidor.
    • salt (string), Padrão: string vazia ""
      • uma string vazia vai automaticamente gerar um salt com o cost especificado
      • obsoleto: se uma string é especificada, isso vai ser usado como um salt. (NÃO FAÇA ISSO!)
      • a string especificada deve ser igual ou maior que 22 caracteres

Retorna

Retorna a senha criptografada como string, false caso contrário. Se uma função callback é especificada, os valores mencionados acima viram os parâmetros do callback, e esta função vai sempre retornar true.

Exemplo

[[|link=|]] Aviso: Se você vai usar o "Exemplo 1" então você vai ter que salvar em 'account data' na chave "hash_password" depois que o servidor reiniciar, senão o script não vai mais funcionar.

Este exemplo faz uso do passwordHash e do passwordVerify na criação e no login de conta para aumentar a segurança.

Click to collapse [-]
Examplo 1
  • Use /accountCreate [username] [password] para criar uma conta.
  • Use /accountLogin [username] [password] para logar em uma conta.
-- vamos criar um command handler que vai nos permitir criar uma conta.
addCommandHandler("accountCreate",function(source,cmd,username,password)
	if (username and password) then
		local hashedPassword = passwordHash(password,"bcrypt",{}) -- cria um novo hash da senha
		if (hashedPassword) then -- verificamos se o hash foi gerado
			local account = addAccount(username,hashedPassword) -- agora vamos criar a conta com a senha que especificamos (só que criptografada)
			if (account) then
				setAccountData(account,"hash_password",hashedPassword) -- salva a senha criptografada desta conta para podermos verificar isso depois, se necessário.
				outputChatBox("Account successfuly created! Now please login. Syntax </accountLogin [username] [password]>",source,20,160,20)
			else
				outputChatBox("Account already exists! Please try again with different username.",source,20,160,20)
			end
		else
			outputChatBox("Securing your password failed! Please try again or contact an administrator.",source,160,20,20)
		end
	else
		outputChatBox("Wrong parameters! Correct Syntax </accountCreate [username] [password]>",source,160,20,20)
	end
end);

-- vamos criar um command handler que vai nos permitir logar em uma conta
addCommandHandler("accountLogin",function(source,cmd,username,password)
	if (username and password) then
		local account = getAccount(username) -- obtemos a conta pelo nome
		if (account) then -- checamos se a conta especificada existe
			local hashedPassword = getAccountData(account,"hash_password") -- obtemos a senha (criptografada) desta conta
			if (passwordVerify(password,hashedPassword)) then -- verifico se a senha especificada é igual a senha criptografada
				if logIn(source,account,hashedPassword) then -- agora logamos o jogador em sua conta
					outputChatBox("Login successfull. Welcome, "..getAccountName(account).."!",source,20,160,20)
				end
			else
				outputChatBox("Password is incorrect!",source,160,20,20)
			end
		else
			outputChatBox("Account doesn't exist! Please try again with different account.",source,160,20,20)
		end
	else
		outputChatBox("Wrong parameters! Correct Syntax </accountLogin [username] [password]>",source,160,20,20)
	end
end);

Veja também