Criptografia

Bom dia pessoal.

Estou utilizando um webservice (php+mysql ) para autenticar o usuário no meu aplicativo, porém os dados do usuário ficam expostos no banco de dados.

Minha pergunta: Devo criptografar a senha do usuário no meu aplicativo ou no banco? Qual tipo de criptografia vocês recomendam utilizar (MD5, sha512, sha256, AES) ou outras?

Se podarem também postar um exemplo eu agradeço

Estou supondo que é um processo de autenticação simples.

Na sua aplicação php (webservice), antes de gravar no banco de dados.

A função password_hash do php usa o bcrypt por padrão, que é bastante recomendado. A documentação lista outras opções.

$senhaDigitada = 'senha_Que_Veio_Da_Requisicao_HTTPS';
$hashDaSenha = password_hash($senhaDigitada, PASSWORD_BCRYPT);
// armazene $hashDaSenha no banco de dados 

Há mais exemplos da documentação, e você pode procurar por php password_hash exemplo no Google para mais.Não esqueça de criar uma coluna com espaço suficiente no banco (ex: varchar(255)).

Abraço.

É melhor criptografar na aplicação php do que na própria aplicação Android? Porque?

Vai simplificar sua vida, pois a geração de hash das senhas e comparação ocorrerá em um único lugar (webservice). Isso facilita, por exemplo, caso você queira adicionar um novo cliente além do aplicativo android (ex: uma página web ou um aplicativo para iOS). Com a autenticação em um único lugar, você não precisa reimplementar a geração do hash em ambientes diferentes, só a interface pro usuário digitar login e senha.

Além disso, é mais seguro seguro: se sua aplicação for comprometida (hackeada), o método de geração do hash da senha e autenticação não será divulgado, o que comprometeria todos os usuários e possivelmente acabaria com a sua aplicação.

Desconheço cenários onde isso seja feito no cliente (aplicativo). O mais comum, até onde sei, é fazer isso no servidor.

Abraço.

Boa noite!

Estou precisando de mais uma ajuda rs.

Adicionei a senha no meu banco da seguinte forma:

$senhaDigitada = 'teste';
$hashDaSenha = password_hash($senhaDigitada, PASSWORD_BCRYPT);
$sql = "INSERT INTO contas (senha) VALUES ('$hashDaSenha')";
$conn->query($sql);

Pelo que entendi para verificar a senha tenho que utilizar o password_verify.

Tentei da seguinte forma:

$login = "'".$_POST['login']."'"; //Recebe login do app
$senha = "'".$_POST['senha']."'"; //Recebe senha do app

$sql = "SELECT * FROM contas WHERE login = $login";
$result = $conn->query($sql);
$registro = mysqli_fetch_array($result);

if(password_verify($senha,$registro['senha'])){
	echo 'Verdadeiro';
}
else {
	echo 'Falso';
}

Só que ele sempre retornar o valor falso.

Não sei se é a melhor formar ou correta de se fazer.