Pergunta

Estou pensando em usar MySQL e é built-in funcionalidade de criptografia para criptografar / descriptografar determinadas colunas em certas tabelas. A preocupação que eu tenho é que eu preciso para armazenar a algum lugar chave. Eu certamente poderia armazenar a chave em um arquivo e controlar as permissões de arquivo e as permissões do aplicativo que acessa-lo, mas é o suficiente? Eu também poderia criar um serviço web para obter a chave ou algo assim.

Eu estou em uma pequena loja onde eu seria o único (possivelmente uma outra pessoa) que teria acesso à máquina que a aplicação estava ligada. Editar:. Devo acrescentar que existe um web enfrentando parte desta aplicação que seria necessário para descriptografar os dados, a menos que eu adicionei uma camada

Eu olhei ad nauseum, mas ninguém parece ter uma resposta à prova de balas.

É este um daqueles problemas em que você tem que se contentar com bom o suficiente? Dado que eu estou usando o MySQL e PHP (possivelmente Python) existe uma melhor maneira de abordar isso?

Foi útil?

Solução

Eu não tenho certeza se usar construir o MySQL em criptografia seria a melhor solução para o seu problema.

M_CRYPT do PHP é pensado para ser muito bom e dá-lhe a flexibilidade de escolher o algoritmo que é mais adequado para suas necessidades.

Armazenando sua chave em algum outro servidor tem uma grande vantagem: a chave não está na mesma máquina que os dados criptografados *) . Então, enquanto o atacante não tem controle suficiente sobre a máquina comprometida, eles não podem chegar à chave.
Se o atacante ganha controle total da máquina os dados são armazenados, eles provavelmente será capaz de consultar o web-service para a chave.

No entanto, transmitindo a chave de uma máquina para outra abre toda uma nova área que precisa ser protegido. Provavelmente envolvendo de mais importantes e mais camadas de criptografia, aumentando assim a chance de erros cometidos.

*) A outra opção é para digitar a senha em cima webserver arranque e apenas mantê-lo na memória.

Solução possível
Se viu uma solução empregada que utilizou o método a seguir para criptografar arquivos para usuários com acesso à web (eu não tenho certeza do seu ambiente, mas pode ser útil):

  • Após a criação do usuário, uma chave aleatória longa é atribuído ao novo usuário.
  • Esta chave aleatória é armazenado em uma coluna criptografada no registro do usuário.
    ( só que desta coluna é criptografada para não afetar o desempenho do resto do registro! )
  • A criptografia da coluna random-chave é feito com uma senha mestra, armazenadas em um arquivo ou na memória.
    ( A melhor opção é digitar a senha em cima olhando o seu servidor web e apenas armazená-lo na memória. )
    ( Outra abordagem seria a de permitir que o usuário digite uma senha e uso que para criptografar / descriptografar a coluna de chave aleatória, mas eu não tenho certeza se isso iria aumentar ou segurança diminuição )
  • Cada documento que precisa ser criptografado é criptografada com a chave aleatória para o usuário e, em seguida, armazenados no disco.
  • Os documentos são armazenados com permissões mínimas no sistema de arquivos.

As vantagens desta abordagem são:
1. O-chave aleatória é criptografada no banco de dados. Então você ainda tem a maior segurança do banco de dados no servidor, em combinação com a coluna criptografada. 2. Os documentos são armazenados com chaves diferentes, se o atacante se apodera de uma chave, apenas uma parte dos documentos está comprometida.

No entanto:
Se o atacante se apodera da senha mestra e tem acesso de leitura à mesa do usuário a, todo o sistema é, mais uma vez, quebrado.

Outras dicas

Eu provavelmente armazená-lo em um arquivo que está em um diretório não acessível via web e bloqueado com permissões de sistema de arquivo, tanto quanto possível.

Seu script voltados para a web não deve abrir todos os arquivos do sistema de arquivos usando variáveis, especialmente aqueles fornecidos pelo usuário. Nem sequer dar-lhes a opção de escorregar algo passou no filtro de entrada (você está filtrando os dados fornecidos pelo usuário certo?) E, possivelmente, dando-se o conteúdo do arquivo de chave. Manter caminhos de arquivo para strings codificadas e define () é única. Desde que a maioria de seus dados são armazenados em MySQL, isso não deve ser um problema.

Ao fazer a descriptografia, ler a chave em uma variável limpa inicializado, faça o descriptografia, em seguida, substituir a variável-chave (dizer com uma série de x 's) e retirar a variável. Isso provavelmente todos os sons um pouco paranóico, mas se você minimizar o tempo é a chave em claro na memória e isolá-lo de todas as outras variáveis ??voando em torno de seu script PHP que não pode fazer-lhe qualquer menos segura.

Se você ea outra pessoa são os únicos que têm acesso físico à máquina, esta é provavelmente apenas multa. Se alguém quebra em e rouba a caixa, bem, eles têm todos os seus dados de qualquer maneira assim game over.

Parece que você está considerando o uso de uma chave 'específico da coluna' para uso com 'AES_ENCRYPT' e 'AES_DECRYPT'. Como o comentarista disse, esta é uma má idéia, porque qualquer intrusão terá acesso a todos os dados.

Se você usar uma senha 'fornecidos user-', com / sem sal, você está sendo muito mais seguro.

Dito isto, se a chave de criptografia é legível apenas pela aplicação de usá-lo, você provavelmente está 'suficientemente bom'. Se a máquina está quebrada em, eles estão indo para obter seus dados mais rapidamente com uma única chave embora.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top