3 horas atrás
(4 horas atrás)RosaScripter Escreveu:(5 horas atrás)White_Blue Escreveu: Repare na sequência de eventos:
O problema é que PlayerInfo[playerid][Salt] e PlayerInfo[playerid][pSenha] estão vazios nesse momento, porque a função CarregarDados (que preenche esses valores) ainda não foi chamada. Você está comparando a senha digitada com nada.
- O jogador clica para logar;
- O seu código executa a função `SHA256_PassHash` usando o valor armazenado em `PlayerInfo[playerid][Salt]` como salt;
- Depois, compara o resultado com `PlayerInfo[playerid][pSenha]`;
- Somente se a comparação for bem-sucedida, você chama CarregarDados(playerid).
Você precisa ler o salt e a senha já hasheada do arquivo do jogador antes de fazer a comparação. Apenas depois que a senha for validada, você pode chamar CarregarDados para carregar o resto das informações.
Código PHP:else // linha 609
{
new senhaformatada[MAX_PASSWORD_LEN];
// PlayerInfo[playerid][Salt] e PlayerInfo[playerid][pSenha] estão vazios
SHA256_PassHash(SenhaInformada[playerid], PlayerInfo[playerid][Salt], senhaformatada, MAX_PASSWORD_LEN);
if(!strcmp(senhaformatada, PlayerInfo[playerid][pSenha], false, MAX_PASSWORD_LEN))
{
CarregarDados(playerid); // Carrega os dados só depois do login, mas é tarde demais para a verificação.
}
else
{
Erro[playerid] ++;
if(Erro[playerid] == 3) Kick(playerid), ErrorMsg(playerid, "Voce foi kickado por errar a senha muitas vezes.");
Dialog_Show(playerid, LoginServidor, DIALOG_STYLE_PASSWORD, "Efetuando login no servidor", "Digite sua senha para logar. \n*Sua senha estava incorreta", "Confirmar", "Cancelar");
}
}
Pode está me mostrando como resolveria? Para eu ter uma noção no que eu deixei passar.. nesse momento estou testando oque me informou.
É bem simples.
Basta carregar o hash e o salt da conta, armazenar os valores em variáveis, gerar o hash da senha informada e comparar os dois.
Código PHP:
else {
new File[256];
format(File, sizeof(File), PASTA_USUARIOS, Name(playerid));
// carregamos o salt e o hash
new stored_salt[SALT_LEN];
new stored_hash[MAX_PASSWORD_LEN];
format(stored_salt, sizeof(stored_salt), DOF2_GetString(File, "pSalt"));
format(stored_hash, sizeof(stored_hash), DOF2_GetString(File, "pSenha"));
// criamos o hash da senha que o jogador informou, usando o salt que acabamos de carregar
new senhaformatada[MAX_PASSWORD_LEN];
SHA256_PassHash(SenhaInformada[playerid], stored_salt, senhaformatada, MAX_PASSWORD_LEN);
// comparamos o hash recém criado com o hash que estava salvo no arquivo
if(!strcmp(senhaformatada, stored_hash))
{
// agora sim, carregamos todos os dados do jogador se a senha estiver correta
CarregarDados(playerid);
}
Não estou disponível para realizar serviços relacionados ao SA-MP e não costumo responder a mensagens privadas, a menos que estejam relacionadas à moderação do fórum.
