Pergunta

Atualmente estou desenvolvendo um sistema para transmissão de dados entre cliente e servidor, e queria saber qual a força da criptografia I planejado para uso era.

Meu pensamento era ter um par público / privado RSA chave e mão a chave pública para cada cliente (deixando a chave privada apenas no servidor). Cada cliente, então, gerar sua própria chave AES e RSA criptografá-lo. Eles, então, AES criptografar seus dados e enviar os dados criptografados e criptografados chave AES para o servidor. O servidor seria então desencriptar a chave AES usando a chave privada, e, em seguida, descriptografar os dados usando a chave AES.

Existem quaisquer falhas de segurança que estou faltando e / ou se existe uma maneira melhor de fazer isso?

Foi útil?

Solução

Isto é quase exatamente como SSL / TLS obras (confira a seção handshake). A única coisa para torná-lo mais forte é para gerar a chave AES para cada conexão, em vez de usar a mesma chave de cada vez. Você também pode querer assinar digitalmente as mensagens que vão para trás e para evitar man-in-the-middle e outros ataques de spoofing.

De um modo geral, a criação de um bom sistema de criptografia é muito difícil. Quando possível, você deve sempre favorecer uma aplicação existente (confiável) para ajudar. Neste caso, você pode considerar o envio de suas mensagens usando HTTPS, em vez de criar seu próprio sistema.

Outras dicas

Você deve nos dar mais informações sobre a linguagem e plataforma que você está usando, para que possamos dar-lhe recomendações específicas sobre as bibliotecas que já existem e wich vai lidar com os detalhes para você. Usando primitivas criptográficas não é diretamente trivial e difícil de obter exatamente certo, e com criptografia, você tem que ser "não é exatamente certo" apenas uma vez para a sua segurança para serem quebradas.


Para responder à sua pergunta, é geralmente uma idéia melhor para criar um segredo sessão (a chave AES) através de um troca Diffie-Hellman , e cada lado use sua chave RSA privada para assinar os seus dados de troca de chaves.

Caso contrário, se o segredo de sessão não é estabelecida através de uma troca DH, um adversário que ganha acesso à chave privada RSA (que tem de ser armazenado em algum lugar) poderia decifrar todo o tráfego que já foi enviada entre o cliente eo servidor.

Se o segredo é estabelecida através de uma troca DH, então somente a parte de autenticação do protocolo seria exposto. Embora um adversário em posse da chave privada RSA, em seguida, não seria capaz de ler qualquer comunicação anterior, ele ainda podia quer introduzir um diálogo autenticado com o cliente / servidor ou lançar um ataque man-in-the-middle (que pode ou não ser feito facilmente, dependendo da rede).

Uma vulnerabilidade seria se um atacante substituído sua chave pública para a chave pública "real". Em seguida, eles seriam capazes de tráfego de interceptação como "man-in-the-middle".

Protocolos como S / MIME, PGP e criptografia TLS uso RSA para chaves de transporte, assim como você propõe. No entanto, as chaves públicas que eles usam estão em certificados assinados por autoridades confiáveis.

A integridade destas autoridades confiáveis ??devem ser cuidadosamente protegido. Por exemplo, eles podem ser queimados em um token de hardware à prova de violação, ou um MAC pode ser calculado sobre eles usando uma senha.

Eu não tenho certeza que sua abordagem vai proteger qualquer coisa! Você vai manter a chave privada do servidor ea chave pública será distribuído. Se eu obter um porão de sua chave pública, eu vou ser capaz de interagir com o seu servidor à vontade. Eu acho que você deve reverter a propriedade chave; cada cliente irá realizar é-próprias chave privada eo servidor terá uma lista de chaves públicas (ala SSH). O servidor terá que adicionar 'autorizada' chaves públicas e apenas aos titulares das chaves privadas será capaz de se conectar.

Espero que isso ajude.

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