Estou desenvolvendo um sistema de intranet local em PHP / MySQL para gerenciar nossos dados de clientes. Parece que a melhor prática seria criptografar os dados confidenciais no servidor MySQL à medida que eles são inseridos.
Não estou claro, no entanto, sobre qual seria a melhor maneira de fazer isso, mantendo os dados prontamente acessíveis.
Parece uma pergunta difícil de responder: onde estão armazenadas as chaves? Como proteger melhor a chave? Se a chave estiver armazenada na máquina de cada usuário, como protegê-la se a máquina for explorada? Se a chave é explorada, como alterar a chave?
Se a chave deve ser armazenada no banco de dados, como protegê-la lá? Como os usuários acessariam?
mysql
encryption
dreno de tempestade
fonte
fonte
Respostas:
Não há realmente nenhum recurso interno do MySQL para lidar com configurações sofisticadas de chaves criptografadas. Você precisará implementar a maior parte da lógica de criptografia em seu próprio código PHP e / ou no navegador (javascript?).
Mas suas preocupações declaradas são um pouco peculiares: parece que suas únicas preocupações reais são uma injeção de SQL ou força bruta (suposição de senha, suponho) ataque de uma estação de trabalho / laptop de cliente remoto. Isso me faz suspeitar que você já tenha outras medidas de segurança não mencionadas planejadas e analisou as possíveis vias de comprometimento.
Por um lado, suponho que você tenha regras de firewall para proteger o host MySQL / PHP contra qualquer tipo de acesso a partir de IPs remotos não aprovados do cliente. Se eu estiver correto, faz sentido que você esteja preocupado apenas com ataques de estações de trabalho de usuários comprometidos.
Além disso, suponho que você entenda que, se um invasor no host do cliente remoto puder escalar para root / privs de administrador ou comprometer diretamente a conta do usuário real, os dados do cliente terão proteção zero, independentemente da criptografia ou de outras salvaguardas. (O invasor pode ler as chaves de onde quer que elas estejam salvas no disco ou espioná-las à medida que o usuário real as entra no logon, e as chaves levam aos dados.)
Partindo dessas duas suposições, faz sentido concluir que as duas únicas ameaças relevantes são: A) adivinhação de senha de força bruta e B) tentativas de injeção de SQL:
Agora, vamos falar sobre como a criptografia do lado do servidor se aplica a estas situações:
A criptografia do lado do cliente, por outro lado, torna os ataques de senha de força bruta irrelevantes. Você não pode forçar com força uma chave adequadamente construída. A criptografia do lado do cliente também mantém basicamente o mesmo nível de proteção contra injeção de SQL que a criptografia do lado do servidor. O cliente pode passar a chave para o servidor no logon, mantendo uma cópia na memória até a sessão terminar, o que coloca a carga de CPU criptográfica no servidor. Ou, o cliente pode lidar com a criptografia / descriptografia por si só, no navegador. Existem altos e baixos nas duas técnicas:
Por fim, observarei que existem grandes desvantagens operacionais na criptografia de dados no banco de dados. Como as representações de dados criptografados são essencialmente padrões aleatórios, os recursos básicos do banco de dados, como indexação, junções etc., não vão funcionar. O cliente assume uma enorme carga lógica e pode perder muitos dos benefícios que os recursos do banco de dados normalmente trazem.
fonte
Você pode querer dar uma olhada no ezNcrypt , que usa ecryptfs, controles de acesso e gerenciamento de chaves para fornecer alta segurança e desempenho à criptografia Linux de bancos de dados MySQL e outros processos. Não, eu não trabalho para eles.
fonte
Você poderia usar o Scytale. É um proxy de criptografia NoSQL para DBMS e aplicativos da web modernos. Suporta criptografia de múltiplos destinatários e grupos. Carregado com um forte sistema de criptografia RSA / AES. Também é 100% gratuito e de código aberto.
https://bitbucket.org/maximelabelle/scytale
fonte