Question

Je développe actuellement un système pour transmettre des données entre le client et le serveur, et je me demandais ce que la force du cryptage je comptais utiliser était.

Ma pensée était d'avoir une clé privée / publique RSA paire et distribuer la clé publique à chaque client (en laissant uniquement la clé privée sur le serveur). Chaque client serait alors générer leur propre clé AES et RSA chiffrer. Ils seraient alors AES crypter leurs données et envoyer les données cryptées et cryptées clé AES sur le serveur. Le serveur décrypte ensuite la clé AES à l'aide de la clé privée, puis décrypter les données en utilisant la clé AES.

Y a-t-il des failles de sécurité me manque et / ou est-il une meilleure façon de le faire?

Était-ce utile?

La solution

Ceci est presque exactement comment fonctionne SSL / TLS (consultez la section de poignée de main). La seule chose à faire est plus forte pour générer la clé AES pour chaque connexion, plutôt que d'utiliser la même clé à chaque fois. Vous pouvez également signer numériquement des messages qui vont et viennent pour éviter l'homme-in-the-middle et d'autres attaques de spoofing.

D'une manière générale, la création d'un bon système de cryptage est très difficile. Lorsque cela est possible, vous devriez toujours favoriser un pour aider l'application existante (confiance). Dans ce cas, vous pourriez envisager d'envoyer vos messages en utilisant le protocole HTTPS, plutôt que de créer votre propre système.

Autres conseils

Vous devriez nous donner plus d'informations sur la langue et la plate-forme que vous utilisez, afin que nous puissions vous donner des recommandations précises au sujet des bibliothèques qui existent déjà et Wich va gérer les détails pour vous. L'utilisation des primitives cryptographiques n'est pas trivial et difficile directement pour obtenir exactement droite, et la cryptographie, vous devez être « pas tout à fait droit » une seule fois pour votre sécurité soit brisée.


Pour répondre à votre question, il est généralement une meilleure idée de créer un secret de session (la touche AES) à travers un l'échange de Diffie-Hellman, et de chaque côté utiliser sa clé privée RSA pour signer ses données échange de clés.

Dans le cas contraire, si le secret de la session n'est pas établie par un échange de DH, un adversaire qui gagne l'accès à la clé privée RSA (qui doit être stocké quelque part) pourrait déchiffrer tout le trafic qui n'a jamais été envoyé entre le client et le serveur.

Si le secret est établi par un échange de DH, alors que la partie d'authentification du protocole serait exposé. Bien qu'un adversaire en possession de la clé privée RSA ne serait alors pas capable de lire une communication antérieure, il pouvait encore soit entrer dans un dialogue authentique avec le client / serveur ou lancer un homme-in-the-middle (qui peut être ou pas facile à faire, selon le réseau).

Une vulnérabilité serait si un attaquant substitué leur clé publique pour la clé publique « réel ». Ensuite, ils seraient en mesure d'intercepter le trafic comme un "man-in-the-middle".

Protocoles comme S / MIME, PGP et TLS utilisent le cryptage RSA pour transporter les clés comme vous proposes. Cependant, les clés publiques qu'ils utilisent sont des certificats signés par les autorités de confiance.

L'intégrité de ces autorités de confiance doit être soigneusement protégé. Par exemple, ils pourraient être brûlés dans un jeton matériel inviolable, ou un MAC peuvent être calculés sur les en utilisant un mot de passe.

Je ne suis pas sûr que votre approche protégera tout! Vous allez garder la clé privée sur le serveur et la clé publique sera distribué. Si je reçois une prise de votre clé publique, je serai en mesure d'interagir avec votre serveur à volonté. Je pense que vous devez inverser la propriété d'une clé; chaque client tiendra-propre clé d'une manière privée et le serveur aura une liste de clés publiques (ala SSH). Le serveur devra ajouter des clés publiques « autorisées » et uniquement aux détenteurs des clés privées seront en mesure de se connecter.

Hope this helps.

scroll top