02/12/2024 18:32
Ótimo trabalho no guia, xBruno1000x!
Tá muito bem explicado e é super útil pra quem quer garantir mais segurança no SA-MP/Open-MP. Mas acho que dá pra complementar com algumas ideias e exemplos práticos que podem deixar ele ainda melhor. Aqui vai:
1. Melhor Proteção com BCrypt
Você já mencionou bcrypt, que é ótimo, mas faltou um exemplo mais completo. Aqui vai um teste básico que valida a senha e, se ela for correta, re-hash para garantir que a gente tá sempre usando o custo computacional mais atualizado (exemplo com custo 12):
Esse exemplo pode ser útil pra quem quer manter a segurança mesmo com atualizações futuras.
2. Bloqueio Progressivo no Login
A sua ideia de bloquear login após várias tentativas é ótima, mas pode ser melhorada. Aqui vai uma versão que usa tempo progressivo para dificultar ataques de força bruta:
Dica: Para produção, considere armazenar o PEPPER em um local seguro, como um sistema de gerenciamento de chaves.
4. Exemplo de Migração de Hashes
Se o servidor usava SHA-256 no passado, aqui está um exemplo de como atualizar os hashes antigos para bcrypt na próxima vez que o usuário logar:
5. Educação de Usuários e Senhas Fortes
Você pode implementar algo simples para reforçar senhas fortes no registro. Por exemplo:
No registro:
Conclusão
Esses exemplos devem ajudar a deixar seu guia mais prático e atrair ainda mais desenvolvedores
Tá muito bem explicado e é super útil pra quem quer garantir mais segurança no SA-MP/Open-MP. Mas acho que dá pra complementar com algumas ideias e exemplos práticos que podem deixar ele ainda melhor. Aqui vai:
1. Melhor Proteção com BCrypt
Você já mencionou bcrypt, que é ótimo, mas faltou um exemplo mais completo. Aqui vai um teste básico que valida a senha e, se ela for correta, re-hash para garantir que a gente tá sempre usando o custo computacional mais atualizado (exemplo com custo 12):
Código PHP:
new hash[72];
// Cadastro do usuário - gerando hash seguro
bcrypt_hash("senhaDoUsuario", hash, sizeof(hash));
printf("Hash gerado: %s", hash);
// Login do usuário - verificando a senha
if (bcrypt_verify("senhaDigitada", hash)) {
printf("Senha correta!");
// Atualiza o hash se o custo computacional for alterado
if (bcrypt_needs_rehash(hash, 12)) {
new hashAtualizado[72];
bcrypt_hash("senhaDigitada", hashAtualizado, sizeof(hashAtualizado));
printf("Hash atualizado para custo mais seguro: %s", hashAtualizado);
}
} else {
printf("Senha incorreta!");
}
2. Bloqueio Progressivo no Login
A sua ideia de bloquear login após várias tentativas é ótima, mas pode ser melhorada. Aqui vai uma versão que usa tempo progressivo para dificultar ataques de força bruta:
Código PHP:
#define MAX_TENTATIVAS 5
new tentativasFalhas[MAX_PLAYERS];
new tempoBloqueio[MAX_PLAYERS];
// Função para verificar tentativa de login
stock VerificarLogin(playerid, senhaDigitada[], hash[]) {
if (tempoBloqueio[playerid] > gettime()) {
new tempoRestante = tempoBloqueio[playerid] - gettime();
SendClientMessage(playerid, -1, "Você está bloqueado! Tente novamente em %d segundos.", tempoRestante);
return 0;
}
if (bcrypt_verify(senhaDigitada, hash)) {
SendClientMessage(playerid, -1, "Login com sucesso!");
tentativasFalhas[playerid] = 0; // Reseta tentativas após sucesso
return 1;
} else {
tentativasFalhas[playerid]++;
if (tentativasFalhas[playerid] >= MAX_TENTATIVAS) {
new tempoBloqueioAtual = pow(2, tentativasFalhas[playerid] - MAX_TENTATIVAS) * 60; // Bloqueio exponencial
tempoBloqueio[playerid] = gettime() + tempoBloqueioAtual;
SendClientMessage(playerid, -1, "Você excedeu o número de tentativas. Tente novamente em %d minutos.", tempoBloqueioAtual / 60);
} else {
SendClientMessage(playerid, -1, "Senha incorreta! Tentativa %d/%d.", tentativasFalhas[playerid], MAX_TENTATIVAS);
}
return 0;
}
}
Dica: Para produção, considere armazenar o PEPPER em um local seguro, como um sistema de gerenciamento de chaves.
4. Exemplo de Migração de Hashes
Se o servidor usava SHA-256 no passado, aqui está um exemplo de como atualizar os hashes antigos para bcrypt na próxima vez que o usuário logar:
Código PHP:
if (SHA256_PassVerify("senhaDigitada", salt, hashAntigo)) {
printf("Hash antigo validado!");
// Migração para bcrypt
new hashNovo[72];
bcrypt_hash("senhaDigitada", hashNovo, sizeof(hashNovo));
AtualizarHashNoBanco(playerid, hashNovo); // Atualiza no banco de dados
printf("Hash atualizado para bcrypt: %s", hashNovo);
} else {
printf("Senha incorreta!");
}
5. Educação de Usuários e Senhas Fortes
Você pode implementar algo simples para reforçar senhas fortes no registro. Por exemplo:
Código PHP:
stock ValidarSenha(senha[]) {
if (strlen(senha) < 8) {
return 0; // Muito curta
}
new temNumero = 0, temLetra = 0, temEspecial = 0;
for (new i = 0; i < strlen(senha); i++) {
if (isdigit(senha[i])) temNumero = 1;
else if (isalpha(senha[i])) temLetra = 1;
else temEspecial = 1;
}
return temNumero && temLetra && temEspecial; // Requer todos os critérios
}
No registro:
Código PHP:
if (!ValidarSenha("senhaDoUsuario")) {
SendClientMessage(playerid, -1, "A senha deve ter pelo menos 8 caracteres, incluir números, letras e caracteres especiais.");
return 0;
}
Conclusão
Esses exemplos devem ajudar a deixar seu guia mais prático e atrair ainda mais desenvolvedores