Accès sécurisé: chiffrement à clé publique en PHP et Javascript
Je suis en train de faire un "normal" nom d'utilisateur/mot de passe formulaire de connexion sécurisée, sans avoir besoin de HTTPS. Mon idée est la suivante:
- Serveur génère une paire de clés pour une sorte d'algorithme de chiffrement assymétrique. Il stocke cette paire de clés dans une table temporaire de toutes sortes (ou peut-être le local des données de session).
- Serveur envoie le formulaire au client et inclut la clé publique.
- Utilisateur remplit le formulaire.
- Avant d'être envoyé au serveur, Javascript crypte le mot de passe à l'aide de la clé publique.
- Formulaire est envoyé.
- Serveur déchiffre le mot de passe avec sa clé privée (qu'il obtient à partir de la table temporaire, à l'aide de la clé publique pour le trouver).
Ce que j'ai besoin de savoir pour cela est:
- Méthode de chiffrement qui est le meilleur à utiliser? RSA?
- Comment décrypter le mot de passe en PHP?
- Et probablement la plus difficile, comment puis-je faire Javascript crypter le mot de passe?
- Toujours utiliser SSL/TLS avec des certificats valides. Si vous avez des raisons autres que la sécurité du réseau de chiffrer la connexion (tels que la prévention de côté de serveur de mot de passe debug/arrêt/normal/etc. exploitation forestière, qui peuvent ensuite être récupérés par un attaquant), vous pouvez utiliser ceci: stackoverflow.com/questions/12457234/...
Vous devez vous connecter pour publier un commentaire.
À l'avance: je suis désolé d'être négatif, cependant;
La mise en œuvre de votre propre protocole de sécurité est jamais une bonne idée, sauf si vous êtes un hautement formé d'experts de la sécurité, ou vous ne pas vraiment se soucier de la sécurité et que vous souhaitez uniquement créer une impression de sécurité (marketing) et arrêter le script kiddies.
SSL n'est certainement pas une serrure d'empreinte digitale, comme si le dire dans vos commentaires, JCryption et votre proposition sont égales à avoir une porte où vous pouvez entrer un code à deux chiffres pour ouvrir la porte et vous avez infini de nombreuses tentatives. Il est difficile de se briser si vous n'êtes pas vraiment intéressé et juste de passage, mais si vous voulez obtenir dans la maison (et vous n'avez probablement, sinon de sécurité ne serait pas nécessaire), vous obtiendrez en.
Un autre point est que les gens oublient souvent de mentionner ce qu'ils veulent atteindre. La sécurité est le célèbre trois composants appelés de la CIA, à savoir la confidentialité, l'intégrité et la disponibilité. Est-il important pour vous que les données que vous avez le transport est confidentielle, ou de l'intégrité est importante (c'est à dire, vous êtes sûr que les données envoyées vient de celui que vous attendez, et non l'homme au milieu)?
Pour en faire du béton dans ce cas, la seule chose que vous devez faire ici, c'est que le passif d'un attaquant ne peut pas voir ce qui est de passage sur la ligne. Dès que votre agresseur s'active et les changements les messages sur leur route, l'ensemble de votre sécurité tombe à l'eau. Donc, mon conseil serait de simplement s'en tenir à la solution les experts sont venus avec TLS (dans ce cas, pas de ssl, puisque c'est l'ancienne version de celui-ci) et assurez-vous que votre serveur la prend en charge.
edit:
Btw, SSL/TLS ne peut pas fonctionner sans certificats. Le point entier dans la clé publique de chiffrement est qu'il doit y avoir au moins quelque partie de confiance.
Sur l'autre main, si vous ne vous inquiétez pas que vos utilisateurs d'obtenir un "certificat non valide" s'affiche, vous pouvez tout simplement créer votre propre certificat et qui est vraiment facile. Dans ce cas, votre certificat n'est pas approuvé par les navigateurs, cependant, vous pouvez être sûr que votre communication est sûr (bon d'accord, il y a des exceptions dans ce cas, mais quand même ...)
L'argument que les certificats doivent être gratuits est vraiment d'un point de vue point de vue. Je pense que les gens qui prétendent que c'est faux/idiot ne sais pas ce qu'il faut pour être une autorité de certification. Ces entreprises investissent des millions dans le but de garder la communication sécurisé, et bien sûr ils ont beau faire de l'argent de la vente de certificats, mais bon c'est leur travail et ils méritent aussi de faire de l'argent, comme toutes les autres.
edit2: après les commentaires
J'ai effectivement dire que vous avez une communication sécurisée. Cependant, vous manquez le point qu'avec les certificats auto-signés, vous ne savez pas à qui vous parlez en toute sécurité. Imaginez une pièce sombre qui est complètement isolé de l'écoute clandestine d'une conversation. Maintenant, imaginez la différence entre une pièce de ce type avec et sans lumière. Si la pièce a de la lumière, vous pouvez réellement voir à qui vous parlez en toute sécurité et seulement choisir de parler à des gens que vous aimez à la confiance. Imaginez faire la même dans une pièce sombre. Vous pouvez seulement espérer que le gars que vous parlez à l'intérieur de cette chambre noire, c'est juste un allié et non celui de votre adversaire. Cependant, vous ne pouvez pas savoir que, juste espère que c'est ok. Et bien que votre conversation en lui-même est sûr, personne ne peut écouter, vous n'avez pas le "plein" de sécurité.
Si je, être un escroc, faire un " man-in-the-middle attack, je peux créer un certificat auto-signé sans que l'utilisateur ne s'en aperçoive. Donc l'avantage de l'utilisation de TLS avec les certificats auto-signés, c'est que vous avez au moins la mise en œuvre du protocole corrent (et même la mise en œuvre de ce qui est loin d'être facile). En outre, vous pouvez éviter le vilain avertissements par le conseiller à vos utilisateurs manuellement confiance à ce certificat à la fois. Cependant, cela n'est possible que si vous avez un groupe relativement restreint de visiteurs, pour un site web public, ce n'est pas vraiment une solution.
Cela ne semble pas qu'sécurisé à partir du point de vue du client. Deux (relative) des problèmes:
Quel est le problème avec ordinaire SSL? Il y a consensus pour dire que c'est sûr, sinon les vendeurs et les organisations de drop de soutien pour toute la nuit. En revanche, la plupart des tentatives pour inventer un funky nouvelle façon de faire de la sécurité "sur le bon marché" généralement manquez pas quelque chose de fondamental.
Il semble que beaucoup de ce que vous voulez faire est fourni par le plugin jquery JCryption. Elle même n'assume PHP comme le back-end, c'est un bon ajustement pour vous.
Livejournal fait quelque chose de similaire à ce que vous voulez et où:
C'est une très bonne idée, et ça a déjà été fait. Voir jCryption.
jCryption semble intéressant, je ne l'ai pas vu avant.
Mais je dois demander quel est le problème avec SSL?
Code de cryptage est notoirement difficiles à faire, et vous pouvez parier que les implémentations SSL trouvé dans les navigateurs et les serveurs http sont beaucoup plus rigoureusement testé et révisé de la jCryption choses.
Cela dit, jCryption a l'air soigné, si vous devez absolument éviter de SSL, et vous n'êtes pas affaire avec des super-sensible de l'information.
En stockant les mots de passe cryptés la méthode sur le serveur, le serveur peut récupérer les mots de passe et de vérifier la somme de contrôle envoyés par le client. Envoyer un mot de passe de session et de demander au client de faire un hash de mot de passe de session et l'utilisateur saisi un mot de passe, faites la même chose sur le serveur et de comparer les deux tables de hachage.
Ce ne sera pas sécurisé, les utilisateurs d'attaques de type MITM - les administrateurs locaux, la NSA, telecom, routeur détourne, mais elle permet de conserver le mot de passe coffre-fort ouvert wlan.