Tout d'abord, cela ne PAS améliorer la sécurité de votre application (en supposant qu'il s'agisse d'une webapp).
Utiliser SSL (Ou en fait TLS, qui est communément appelé SSL), il n'est pas vraiment cher (Mesurez le temps que vous utilisez pour trouver des moyens de le contourner et multipliez-le par le salaire minimum, l'achat d'un certificat l'emporte presque toujours).
Le pourquoi de cette situation est simple. TLS résout un problème (lorsqu'il est utilisé avec des certificats achetés, et non auto-signés) qui est assez important en cryptographie : Comment puis-je savoir que le serveur auquel je parle est bien le serveur auquel je pense parler ? Les certificats TLS sont une façon de dire : "Moi, l'autorité de certification, à laquelle votre navigateur fait confiance, certifie que le site web à l'adresse [url] possède cette clé publique, avec une clé privée correspondante, que (clé privée) seul le serveur connaît, regardez j'ai signé ma signature sur tout le document, si quelqu'un l'a modifié vous pouvez le voir".
Sans TLS, tout cryptage devient inutile, car si je m'assois à côté de vous dans un café, je peux faire en sorte que votre ordinateur portable/smartphone pense que je suis le serveur et que je suis l'homme du milieu (MiTM). Avec TLS, votre ordinateur portable/smartphone criera "CONNEXION NON CONTRACTÉE", car je n'ai pas de certificat signé par une autorité de certification correspondant à votre site. (Cryptage contre authentification).
Avertissement : les utilisateurs ont tendance à cliquer sur ces avertissements : "Connexion non fiable ? Quoi ? Je veux juste mes photos de chatons ! Ajouter une exception Cliquez sur Confirmer Cliquez sur YAY ! Des chatons !"
Toutefois, si vous ne voulez vraiment pas acheter de certificat, vous pouvez quand même DO implémenter le hachage javascript côté client (et utiliser la bibliothèque de Standford (SJCL) pour cela, N'INSTALLEZ JAMAIS LA CRYPTOGRAPHIE VOUS-MÊME ).
Pourquoi ? Réutilisation du mot de passe ! Je peux facilement voler votre cookie de session (qui me permet de faire croire à votre serveur que je suis vous) sans HTTPS (voir firesheep). Cependant, si vous ajoutez un javascript à votre page de connexion qui, avant l'envoi, hachera votre mot de passe (utilisez SHA256, ou encore mieux, utilisez SHA256, envoyez-leur une clé publique que vous avez générée puis cryptez le mot de passe haché avec cela, vous ne pouvez pas utiliser un sel avec cela), et ensuite envoie le mot de passe haché/crypté au serveur. RECHAQUER le hachage sur votre serveur avec un sel et le comparer à ce qui est stocké dans votre base de données. (stockez le mot de passe comme ceci :
(SHA256(SHA256(password)+salt))
(sauvegarder le sel en clair dans la base de données également)). Et envoyez votre mot de passe comme ceci :
RSA_With_Public_Key(SHA256(password))
et vérifiez votre mot de passe comme ceci :
if SHA256(RSA_With_Private_Key(SHA256(sent_password))+salt_for_username) == stored_pass: login = ok
Parce que, SI quelqu'un renifle votre client, il pourra se connecter en tant que votre client (détournement de session) mais il JAMAIS voir le mot de passe en clair (à moins qu'ils ne modifient votre javascript, cependant, un pirate de Starbucks ne saura probablement pas comment faire/être intéressé par cela). Ils auront donc accès à votre application Web, mais pas à leur courrier électronique/facebook/etc. (pour lesquels vos utilisateurs utiliseront probablement le même mot de passe). (L'adresse e-mail sera soit leur nom de connexion, soit se trouvera dans leur profil/paramètres sur votre application web).
3 votes
Je pensais hacher le mot de passe du côté du client, mais seulement pour être sûr que le mot de passe du client n'existe jamais en clair du côté du serveur, ce qui signifie qu'il peut se sentir plus à l'aise en sachant que je ne connais pas son mot de passe réel, ou que je ne peux pas facilement le donner s'il est compromis.
1 votes
Juste pour être complet, puisque nous parlons de sécurité et que MD5 a été mentionné dans l'OP : Il faut toujours utiliser un sel lors du chiffrement d'un mot de passe. L'utilisation du MD5 brut, non salé, est à peine meilleure que le stockage de mots de passe en clair dans votre base de données.
2 votes
@Cyclone Le hachage SEULEMENT côté client est définitivement une mauvaise idée, car si l'attaquant connaît le hachage, il peut l'utiliser pour se connecter comme s'il connaissait le mot de passe, en contournant le code de hachage côté client.
6 votes
@Teejay : C'est pourquoi vous n'envoyez pas le hachage en clair. Le serveur envoie un sel aléatoire au client, vous ajoutez le hachage du mot de passe, et vous hachurez à nouveau le tout, puis vous renvoyez le tout au serveur qui fait le même calcul. Une attaque par rejeu échoue parce que le sel sera différent.
0 votes
@MSalters Si elle est mise en œuvre comme vous l'avez dit, c'est bon. Mais ce n'est pas ce que cyclone a dit.
3 votes
Cette question ne devrait-elle pas être posée sur security.stackexchange.com ?
1 votes
@sab669 : Parce que cela signifierait que le client enverrait le hachage non salé sur le réseau. Un attaquant peut l'intercepter et effectuer une attaque par rejeu. Mais si le client n'envoie que des hachages salés, un attaquant devrait "déhacher" le message pour changer le sel et réaliser une attaque par rejeu. Et les fonctions de hachage correctes ne peuvent pas être "déhachées". (Ce commentaire vient-il d'être supprimé ?)