Como evito que a senha do banco de dados seja armazenada em texto simples no código-fonte?
-
09-06-2019 - |
Pergunta
Na aplicação web que estou desenvolvendo atualmente uso uma solução ingênua ao conectar ao banco de dados:
Connection c = DriverManager.getConnection("url", "username", "password");
Isso é muito inseguro.Se um invasor obtiver acesso ao código-fonte, ele também obterá acesso ao próprio banco de dados.Como meu aplicativo da web pode se conectar ao banco de dados sem armazenar a senha do banco de dados em texto simples no código-fonte?
Solução
Você pode armazenar a cadeia de conexão no arquivo Web.config ou App.config e criptografar a seção que a contém.Aqui está um artigo muito bom que usei em um projeto anterior para criptografar a string de conexão:
http://www.ondotnet.com/pub/a/dotnet/2005/02/15/encryptingconnstring.html
Outras dicas
No .NET, a convenção é armazenar strings de conexão em um arquivo de configuração separado.
Aí, o arquivo de configuração pode ser criptografado.
Se você estiver usando o Microsoft SQL Server, tudo isso se tornará irrelevante se você usar uma conta de domínio para executar o aplicativo, que então usará uma conexão confiável com o banco de dados.A string de conexão não conterá nenhum nome de usuário e senha nesse caso.
Posso recomendar estas técnicas para programadores .NET:
- Criptografar senha\string de conexão no arquivo de configuração
- Configure uma conexão confiável entre cliente e servidor (ou seja,usar autenticação do Windows, etc.)
Aqui estão artigos úteis do CodeProject:
A menos que eu esteja perdendo o ponto, a conexão deve ser gerenciada pelo servidor por meio de um pool de conexões; portanto, as credenciais de conexão são mantidas pelo servidor e não pelo aplicativo.
Levando isso adiante, geralmente construo uma convenção em que o aplicativo web front-end (em uma DMZ) apenas se comunica com o banco de dados por meio de um serviço web (no domínio), fornecendo, portanto, separação completa e segurança aprimorada do banco de dados.
Além disso, nunca dê privilégios à conta do banco de dados além do que é essencialmente necessário.
Uma abordagem alternativa é executar todas as operações por meio de procedimentos armazenados e conceder ao usuário do aplicativo acesso apenas a esses processos.
Supondo que você esteja usando o MS SQL, você pode aproveitar as vantagens da autenticação do Windows, que não requer nome de usuário/senha em nenhum lugar do código-fonte.Caso contrário, eu teria que concordar com os outros postadores que recomendam app.config + criptografia.
- Crie um usuário de sistema operacional
- Coloque a senha em uma variável de ambiente O/S para esse usuário
- Execute o programa como esse usuário
Vantagens:
- Somente root ou esse usuário pode visualizar as variáveis de ambiente de sistema operacional desse usuário
- Sobrevive à reinicialização
- Você nunca verifica acidentalmente a senha no controle de origem
- Você não precisa se preocupar em estragar as permissões de arquivo
- Você não precisa se preocupar com onde armazena uma chave de criptografia
- Funciona na plataforma x