Criptografia em repouso
Criptografia em repouso são os dados no banco de dados quando não estão sendo usados/acessados ou atualizados. Criptografia em movimento são coisas como
TLS
onde os dados (do banco de dados ) é transportado de servidor para servidor para navegador, para servidor, para navegador, etc. O TLS é perfeitamente bom na maioria das situações se for tratado com cuidado e abordado com uma atitude de que você precisa fazer mais do que o mínimo para torná-lo realmente seguro. Um exemplo típico é que as pessoas colocam um certificado TLS da LetsEncrypt em seu domínio e pensam que de repente todas as suas coisas estão seguras; mas eles não criptografam suas sessões ou seus cookies deixando um enorme buraco potencial em suas defesas.
Não use o sistema de criptografia integrado do MySQL.
Eu não posso enfatizar isso o suficiente; o sistema de criptografia embutido no MySQL não é adequado para proteção de dados segura real.
Leia minha resposta a uma pergunta muito semelhante aqui quanto aos detalhes (não quero simplesmente copiar/colar ).
Ok, então, porque você insiste... aqui:
Pelo que li em minha própria pesquisa sobre este tópico, o link fornecido por Magnus para defuse/php -criptografia é uma das melhores maneiras de evitar que o MySQL faça com que você comprometa seus dados, nunca permitindo que o programa/servidor MySQL veja o valor de texto simples de seus dados.
-- Resposta publicada em 7 de maio de 2017.
Também resposta de Bill Karwin para a mesma pergunta fornece algumas informações adicionais valiosas:
-- Resposta publicada em 7 de maio de 2017.
Ponto de Fechamento:
A segurança é complexa. Se você quiser fazer isso corretamente e ter confiança em suas cascas protetoras de cebola, então você precisa fazer muitas coisas (veja as balas abaixo); mas a primeira coisa que você precisa fazer é:
-
Defina contra quem você está protegendo
Seriamente. Você precisa de estratégias diferentes contra alguém que quer roubar seus nomes e endereços em texto simples versus alguém que quer assumir seu servidor versus alguém que simplesmente quer destruir os dados apenas porque. É um mito que você pode se proteger contra todos o tempo todo, pelo conceito isso é impossível*; então você precisa definir os agressores mais prováveis e então descobrir a melhor forma de mitigar seus avanços.
Especificamente para MySQL, algumas recomendações claras:
-
Mantenha o SQL e o PHP no mesmo servidor. Não acesse remotamente os dados do MySQL.
-
Exclua o acesso externo ao SQL (portanto, élocalhost
só)
-
Ofusque seus nomes de tabelas e nomes de colunas; se alguém invadir seus dados e você tiverHDTBJ^BTUETHNUYT
na colunausername
então eles sabem que esse ilegível é provavelmente um nome de usuário, então eles têm um bom começo na tentativa de quebrar sua criptografia.
-
IMPORTANTE :realmente bloqueie o acesso à sua mesa; configurar muitos usuários MySQL, cada um com apenas os privilégios mínimos para fazer o que eles precisam; você deseja que um usuário leia a tabela (somente ) e leia apenas algumas tabelas; usuários escrevam em determinadas tabelas, mas não têm acesso a outras tabelas. É uma separação de preocupação para que, se algum usuário do MySQL for comprometido; você não perdeu automaticamente todos os dados nele contidos.
-
Use serviços de criptografia PHP. Armazene as chaves de criptografia em um local completamente separado; por exemplo, tenha outro servidor que você use apenas para backup que você possa acessar apenas para obter as chaves de criptografia, portanto, se seu servidor PHP/MySQL estiver comprometido, você terá algum espaço para cortar e bloquear o servidor de chaves para que você possa limitar o dano. Se o servidor de chaves também tiver backups, então você não está muito comprometido (dependente da situação ).
-
Configure muitos observadores e informantes de e-mail para dizer exatamente quando certos processos estão sendo executados e quais usuários do servidor (não pessoas, mas programas) estão fazendo o quê. Assim, você pode ver por que um processo inesperado começa a ser executado às 5 da manhã para tentar medir o tamanho das tabelas do MySQL. WTF?
-
Há muito potencial para ter seus dados MySQL AES_ENCRYPT "farejados" mesmo que não estejam em repouso no banco de dados, mas se o site for comprometido (ou pior, o código PHP for inseguro), os ataques de tempo podem funcionar conteúdo de dados por pesquisas de consulta de tempo e retornos de pacotes de dados.
-
A segurança é um buraco negro; em algum momento ou outro você vai pensar "Ei, eu já fiz o suficiente". Ninguém nunca tem segurança total, algumas organizações muito dedicadas têm o suficiente segurança. Você precisa descobrir o quanto está disposto a caminhar antes de percorrer a distância.
* Por que impossível? Porque para proteger seus dados de todas as ameaças, o tempo todo, eles precisariam ser ilegíveis, inutilizáveis, como um hash. Um hash é protegido de todos, o tempo todo. Mas um hash nunca pode ser descompactado.