Si votre hébergeur le permet, ou si vous devez traiter des données sensibles, utilisez HTTPS, point final. (La loi l'exige souvent).
Sinon, si vous voulez faire quelque chose par HTTP. Je ferais quelque chose comme ça.
- Le serveur intègre sa clé publique dans la page de connexion.
- Le client remplit le formulaire de connexion et clique sur "soumettre".
- Une requête AJAX obtient du serveur l'horodatage actuel.
- Côté client, le script concatène les informations d'identification, l'horodatage et un sel (haché à partir de données analogiques, par exemple les mouvements de la souris, les événements de pression sur les touches), et les chiffre en utilisant la clé publique.
- Soumet le hachage résultant.
- Le serveur décrypte le hash
- Vérifie si l'horodatage est suffisamment récent (permet une courte fenêtre de 5-10 secondes seulement). Rejette le login si l'horodatage est trop ancien.
- Stocke le hachage pendant 20 secondes. Rejette le même hachage pour la connexion pendant cet intervalle.
- Authentifie l'utilisateur.
De cette façon, le mot de passe est protégé et le même hachage d'authentification ne peut pas être rejoué.
À propos de la sécurité du jeton de session. C'est un peu plus difficile. Mais il est possible de rendre un peu plus difficile la réutilisation d'un jeton de session volé.
- Le serveur définit un cookie de session supplémentaire qui contient une chaîne aléatoire.
- Le navigateur renvoie ce cookie lors de la prochaine demande.
- Le serveur vérifie la valeur dans le cookie, si elle est différente, il détruit la session, sinon tout va bien.
- Le serveur place à nouveau le cookie avec un texte différent.
Ainsi, si le jeton de session est volé et qu'une demande est envoyée par quelqu'un d'autre, la session sera détruite lors de la prochaine demande de l'utilisateur original. Ainsi, si l'utilisateur navigue activement sur le site et clique souvent sur des liens, le voleur n'ira pas loin avec le jeton volé. Ce schéma peut être renforcé en exigeant une autre authentification pour les opérations sensibles (comme la suppression d'un compte).
À propos de la mise en œuvre : RSA est probablement l'algorithme le plus connu, mais il est assez lent pour les clés longues. Je ne sais pas quelle serait la vitesse d'une implémentation PHP ou Javascript. Mais il existe probablement des algorithmes plus rapides.