2015-09-30 1 views
1

J'utilise scrypt pour générer des hachages forts du mot de passe de l'utilisateur. Je veux connecter l'utilisateur, mais je ne veux pas envoyer le mot de passe en clair sur le fil, comment puis-je vérifier si le mot de passe est correct (sans un aller-retour), car il est salé?Authentification avec mot de passe salé

Je rencontre un scénario client/serveur. Le client est une application sur un ordinateur de bureau (pas un site Web, ni un serveur http).

Comment puis-je y parvenir? Je suis venu seulement jusqu'ici: je génère le hachage du sel + sur le client, en forme un mcf et l'envoie à mon serveur. Enregistrez le mcf dans la base de données. Je n'ai pas envoyé le mot de passe, juste le hash qui est pratiquement inutile (puisque scrypt devrait être assez fort, et nécessiterait quelques millions d'années pour l'inverser). Comment puis-je maintenant connecter l'utilisateur à mon service, sans envoyer le mot de passe en clair au serveur pour le comparer? Je ne peux pas le ressasser, car cela se traduirait par un hachage différent en raison d'un sel différent? Je devrais envoyer le sel au client, hacher le mot de passe, envoyer le hachage au serveur, le comparer et envoyer un jeton d'authentification.

Comment puis-je y parvenir? Un jeton d'authentification est-il réellement sécurisé? Il peut être simplement utilisé pour usurper l'identité de quelqu'un, je suppose?

Répondre

2

ne veulent pas envoyer le mot de passe en texte clair sur le fil,

Bonne idée, mais si la connexion est pas crypté (quelque chose comme SSL/TLS), puis tout ce que vous envoyez est en texte clair. Si vous hachez un mot de passe côté client et que vous l'envoyez sur le réseau, CELA est le mot de passe. Certains diront qu'il n'y a aucun avantage ici, mais cela empêche l'utilisateur d'exposer son mot de passe, qu'il réutilise probablement sur d'autres sites. (read more here)

Idéalement, vous utiliseriez quelque chose comme SSL/TLS pour chiffrer la connexion. Je suppose que si cela n'était pas possible, utiliser un cryptage asymétrique avec des certificats sur le message que vous envoyez serait un bon moyen de réinventer la roue, mais j'hésite à le recommander sans qu'une personne chargée de la sécurité ne le remarque. C'est très facile à bousiller, et la règle n'est jamais de lancer votre propre système de chiffrement.

Si vous ne pouvez pas vérifier/invalider/mettre à jour la clé publique, ce n'est pas un bon schéma.

je besoin d'envoyer le sel au client, hachage du mot de passe, envoyer le hachage au serveur, comparer et envoyer une arrière jeton d'authentification

Le sel est pas censé Soyez super secret, mais ce n'est pas génial de le donner comme ça, surtout aux utilisateurs non authentifiés. Le jeton d'authentification, le hachage, le sel, etc. peuvent tous être interceptés si la connexion n'est pas cryptée. Même s'ils ne pouvaient pas, vous n'avez pas résolu le problème des utilisateurs créant des comptes grâce à cette méthode (peut-être que vous n'en avez pas besoin, mais cela vaut la peine de le mentionner).

Vous devez utiliser un cryptage asymétrique où seul le serveur peut déchiffrer les données.

+1

'alors c'est le mot de passe'. doh. Tu as raison. Comment les applications courantes traitent-elles les attaques de type mitm? Je fais évidemment toute communication sur SSL/TLS. J'ai aussi pensé à utiliser HMAC pour vérifier toutes les requêtes avec un hash, mais je devrais l'envoyer au moins une fois de toute façon, ce qui le rend inutile. – Leandros

+2

"Je suis évidemment en train de faire des communications via SSL/TLS." Alors vous le faites bien, mon frère. Sous le capot, TLS utilise un HMAC pour s'assurer que la modification du message entraînerait une erreur. Votre configuration semble sécurisée alors - puisque le mot de passe n'est pas réellement en clair. Avec TLS, l'attaquant ne devrait pas être en mesure de faire une attaque MitM sur vous - il faudrait visser avec vos autorités de certification de confiance sur la machine locale. – Gray

+0

Je discutais de la question avec un de mes amis, SSL utilise essentiellement le cryptage à clé publique/privée, non? (quelque chose dans le genre de [ceci] (https://www.comodo.com/resources/small-business/digital-certificates2.php)). Quel est le même que votre cryptage asymétrique mentionné? – Leandros

1

Il n'y a pas de réponse courte à votre question, car il y a tellement de pièges qui peuvent arriver si vous le faites mal. Mais comme le dit Gray, vous avez besoin de la protection TLS.

J'ai deux sources qui vous donnent des explications détaillées sur la bonne façon de le faire si vous voulez faire le traitement de scrypt côté client.

  1. Method to Protect Passwords in Databases for Web Applications. Si vous ne voulez pas comprendre toutes les raisons, passez directement à la section 4 pour voir l'implémentation (où PPF = votre scrypt).
  2. Client-Plus-Server Password Hashing as a Potential Way to Improve Security Against Brute Force Attacks without Overloading the Server.

Ce sont des solutions légèrement différentes mais basées sur les mêmes idées, et qui devraient être assez bonnes pour vous.