Pergunta

Eu só descobri sobre estouro de pilha e eu estou apenas verificando se existem ideias para uma restrição que estou tendo com alguns amigos em um projeto, mas isso é mais uma questão teórica a que eu fui tentando encontrar uma resposta por algum tempo.

Eu não sou muito dado em criptografia, mas se eu não sou suficientemente claro que vou tentar editar / comentário para esclarecer qualquer dúvida.

Tentando ser breve, o ambiente é algo como isto:

  • Uma aplicação onde o front-end como o acesso a criptografar / descriptografar e chaves do back-end é apenas usado para armazenamento e consultas.

  • Ter um banco de dados para que você não pode ter acesso por um par de campos Por exemplo, vamos dizer "endereço", que é text / varchar como de costume.

  • Você não tem acesso à chave para descriptografar as informações e toda a informação chega ao banco de dados já criptografada.

O principal problema é algo parecido com isso, como fazer consistentemente consultas no banco de dados, é impossível fazer coisas como "onde endereço como '% F§YU /' ~ # JKSks23%'". (Se há alguém sentimento com uma resposta para essa sensação livre para dispará-la).

Mas é ok para fazer where address='±!NNsj3~^º-:'? Ou seria também comem completamente o banco de dados?

Outra conter que pode aplicar é que o front-end não tem muito poder de processamento disponível, então já criptografar / descriptografar Inicia as informações para empurrá-lo para os seus limites. (Dizendo isso apenas para respostas Evite como "exportação de uma junção de tabelas para o front-end e consulta-lo lá".)

Será que alguém me apontar uma direção para manter o pensamento sobre isso?


Bem, obrigada respostas para tão rápido às 4 da manhã, para um tempo de uso primeiro eu estou me sentindo realmente impressionado com esta comunidade. (Ou talvez eu sou é apenas para o fuso horário diferente)

Apenas alimentando algumas informações:

O principal problema é tudo o correspondente ao redor parcial. Como um requisito obrigatório na maioria dos bancos de dados é permitir que os resultados parciais. A principal restrição é realmente o proprietário do banco não seria permitido a olhar para dentro do banco de dados para informações . Durante os últimos 10 minutos, eu vim acima com uma solução possível que se estende novamente para possíveis problemas de banco de dados, a que vou acrescentar aqui:

solução possível para permitir uma correspondência parcial semi:

  • A senha + um par de campos públicos do usuário são realmente a chave para a encriptação. Para a autenticação, a idéia é criptografar um valor estático e compará-lo no banco de dados.
  • Criar um novo conjunto de tabelas onde as informações são armazenadas de forma analisado, o que significa algo como: "4th Street" se tornaria 2 linhas criptografados (um para '4' outro para 'Street'). Isso já permitiria correspondência semi-parcial como uma busca já poderia ser realizada nas mesas separadas.

New pergunta:

  • Será que isso provavelmente comer o servidor de banco de dados novamente, ou será que alguém acha que é uma solução viável para o problema de correspondência parcial?

Post Scriptum:. Eu tenho unaccepted a resposta do Cade Roux apenas para permitir uma discussão mais aprofundada e, especialmente, uma possível resposta à nova pergunta

Foi útil?

Solução

Você pode fazê-lo da maneira que você descreve - consultando efetivamente o hash, digamos, mas não há muitos sistemas com essa exigência, porque naquele momento os requisitos de segurança estão interferindo com outros requisitos para o sistema para ser usado - ou seja, sem parcial partidas, desde a criptografia regras que fora. É o mesmo problema com a compressão. Anos atrás, em um ambiente muito pequeno, eu tive que comprimir os dados antes de colocá-lo no formato de dados. Claro, esses campos não poderia facilmente ser pesquisado.

Em uma aplicação mais típica, em última análise, as chaves vão estar disponível para alguém na cadeia -., Provavelmente, o servidor web

Para SSL tráfego do usuário final protege essa tubulação. Alguns switches de rede pode protegê-lo entre o servidor web e banco de dados e armazenamento de dados criptografados no banco de dados é bom, mas você não está indo para consulta em dados criptografados assim.

E uma vez que os dados são exibidos, é lá fora, na máquina, de modo que qualquer uso geral dispositivo de computação pode ser contornado nesse ponto, e você tem as defesas de perímetro fora da sua aplicação que realmente entram em jogo.

Outras dicas

Por que não criptografar o disco segurando as tabelas de banco de dados, criptografar as conexões de banco de dados, e deixar o banco de dados funcionar normalmente?

[i realmente não entendo o contexto / contraints que exigem esse nível de paranoia]

EDIT: "limitações da lei" eh? Espero que você não está envolvido em algo ilegal, eu odiaria ser um acessório inadvertida ...; -)

Se o - ahem - constrangimentos legais - forçar esta solução, então isso é tudo o que há para ser feito -. Sem resultados semelhantes, e resposta lenta se as máquinas cliente não pode lidar com isso

Há alguns meses atrás me deparei com o mesmo problema:. Todo o banco de dados (exceto índices) é criptografada e que o problema das partidas parciais levantou

Eu procurei na Internet à procura de uma solução, mas parece que não há muito a fazer sobre isso, mas uma "solução alternativa".

A solução que eu definitivamente aprovado é:

  1. Criar uma tabela temporária com os dados do campo na qual a consulta está sendo realizada, decifrados e outro campo que é a chave primária da tabela (obviamente, este campo não tem que ser decifrado como está plain-text).

  2. Execute as agains correspondência parcial que a tabela temporária e recuperar os identificadores.

  3. consultar a tabela real para esses identificadores e retornar o resultado.

  4. Elimine a tabela temporária.

Estou ciente de que isto supõe uma sobrecarga de não-trivial, mas eu não encontrei outra maneira de executar esta tarefa quando é obrigatório que o banco de dados é totalmente criptografado.

Dependendo de cada caso em particular, você pode ser capaz de filtrar o número de linhas que são inseridos na tabela temporária sem perder dados para o resultado (considerar apenas as linhas que pertencem ao usuário que está executando a consulta, etc. ..).

Você quer fazer uso hash MD5. Basicamente, ele leva a sua corda e transforma-lo em um hash que não pode ser reproduzido. então você pode usá-lo para validar contra as coisas mais tarde. Por exemplo:

$salt = "123-=asd";
$address = "3412 g ave";

$sql = "INSERT INTO addresses (address) VALUES ('" . md5($salt . $address) . "')";
mysql_query($sql);

Então, para validar um endereço no futuro:

$salt = "123-=asd";
$address = "3412 g ave";

$sql = "SELECT address FROM addresses WHERE address = '" . md5($salt . $address) . "'";
$res = mysql_query($sql);
if (mysql_fetch_row($res))
    // exists
else
    // does not

Agora que é criptografada no lado do banco de dados para que ninguém possa encontrá-lo fora - mesmo se eles olharam em seu código fonte. No entanto, encontrar o sal irá ajudá-los a decifrá-lo embora.

http://en.wikipedia.org/wiki/MD5

Se você precisa armazenar dados confidenciais que você deseja consultar mais tarde eu recomendo para armazená-lo em texto simples, restringindo o acesso a que as tabelas, tanto quanto possível.

Se você não pode fazer isso, e você não quer sobrecarga no front-end, você pode fazer um componente no final de volta, rodando em um servidor, que processa os dados criptografados.

Fazendo querys aos dados criptografados? Se você estiver usando um algoritmo de criptografia bom Eu não posso imaginar como fazer isso.

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