2010-02-27 3 views
0

J'ai un service Web sur un réseau non sécurisé qui nécessite une autorisation. Je souhaite l'implémenter sur HTTP, au lieu de HTTPS, en évitant en même temps les attaques de type "man-in-the-middle" et "sniffing". Je n'ai besoin que d'une clé pour le client et le serveur.S'il vous plaît recommander un moyen d'autoriser une transaction en texte brut sur HTTP en Java?

Le client appelle une fonction serveur et le serveur peut déterminer si ce client a raison et peut renvoyer une réponse qui doit être signée et non cryptée.

J'ai une idée brute comment cela pourrait être mis en œuvre, et donnera comme exemple:

Pseudocode 
Web service and client has already shared PASSCODE1 and PASSCODE2 

First Handshake: 
Client pings web service 
Web service sends random string A with length 
Client checks A is nonnull, and sends Hash X=(md5(A XOR PASSCODE1) XOR 
    concat("RIGHT",random string B) XOR PASSCODE2) 
Web service receives Hash X, checks if "RIGHT" is there, saves key B, sends 
    Hash Y=(md5(B XOR PASSCODE1) XOR concat ("RIGHT", random string C) 
     XOR PASSCODE2) 
Client checks if this value is right, and they are authenticated 
At this point, if everything goes right, have keys B and C for this 
    particular transaction 

Sample Transaction: 
Client calls function(args, md5(args, C) XOR PASSCODE2) 
Server returns (object(), md5(args, B) XOR PASSCODE2) 

keys expire after a few minutes, and a new key pair needs to be requested 

Je sais que cette méthode est vraiment brut, qu'il ya d'autres façons de le faire? En particulier, je cherche à le faire en Java.

+1

Et quelle est exactement la raison pour laquelle vous reculez après 35 ans de recherche cryptographique? Si vous êtes réellement concerné par MITM, alors vous devez faire quelque chose où vous vous souciez réellement de la sécurité. Choisissez une langue et vous pouvez trouver une implémentation complète de HTTPS. Ou SSH. Ce truc n'est * pas * facile à corriger, et il est très, * très * facile de se tromper. –

+0

@ Peter, je peux seulement distribuer sur un serveur web HTTP, et j'ai un client dédié. Je demande ce qui montre que je n'essaie pas de partir, juste savoir ce que je peux utiliser. – TiansHUo

Répondre

3

D'une manière générale, vous ne devriez pas le faire vous-même. En fonction de la plate-forme que vous utilisez, il existe plus que probablement un cadre disponible qui implémente le WS-Security specification.

Cette spécification couvre l'intégrité des messages ainsi que le chiffrement des messages en utilisant du texte brut (en d'autres termes, sur HTTP) en utilisant des certificats X.509. Cependant, ce qui est important, c'est que vous protégiez les certificats utilisés pour la signature, car vous ne pouvez pas éviter les attaques de type "man-in-the-middle" si le certificat est ouvert. Un Google search for the terms "java WS-security" révèle quelques ressources sur how to implement the WS-Security specification in Java. Cependant, vous pourriez vouloir regarder le Web Services Developers Pack, car il semble être un peu plus normalisé dans le cadre.

+0

Pourriez-vous recommander des plates-formes pour Java, WSS4J semble difficile à déployer? – TiansHUo

+0

@TiansHUo: Question mise à jour pour refléter que vous utilisez Java, ainsi que ma réponse à certaines ressources. – casperOne

1

Comme d'autres l'ont commenté, SSL est la façon de le faire. Rouler le vôtre est une recette pour se tromper.

Si vous concevez votre propre combinaison d'algorithmes de hachage et de cryptage, et que vous n'êtes pas un cryptographe hotshot, vous êtes à peu près assuré de trouver quelque chose d'exploitable. Que vous vous souciez assez, bien sûr, est une autre question. Peut-être que vous essayez seulement de vous défendre contre des attaquants occasionnels qui ne mettraient pas l'effort dans les faiblesses d'exploitation dans votre approche.

Une approche pourrait être d'échanger du contenu S/MIME sur du HTTP simple. Au moins, vous maintenez un mécanisme établi.

Questions connexes