Imaginez la situation suivante. Nous créons une application Web qui devrait être vraiment sûre
Maintenant, les comptes/utilisateurs ne sont pas ajoutés directement par nous, mais ils reçoivent une lettre avec un code de connexion. Nous obtenons de temps en temps un fichier contenant un hachage SHA-1 non salé de ce code de connexion, et quelques autres informations vraiment basiques.
Considérant que SHA-1 est maintenant considéré comme un passif, et le logiciel générant ces hachages n'est pas sous notre contrôle (c'est aussi probablement un ancien logiciel qui n'est pas capable de meilleurs hachages)
Serait-ce une solution pour hacher le hachage reçu en utilisant Bcrypt. Cela devrait résoudre le problème de son danger/trop rapide si je me trompe? Dois-je également ajouter un poivre?
Y a-t-il d'autres problèmes que j'aurais pu manquer? Ou devrions-nous repousser le problème et les faire réparer leur logiciel pour de meilleures fonctions de hachage?
Clarification:
Notre client est un employé d'une entreprise et doit être approuvé pour ce projet.
Le tiers a réalisé un système pour l'entreprise de notre client qui gère les informations sensibles sur les clients de notre entreprise cliente. Ils veulent donner à certains de leurs clients la possibilité de se connecter à notre application, cela doit se faire via leur système car c'est ce que les employés de notre client savent et s'ils devaient ajouter des utilisateurs manuellement dans notre application, notre client n'obtiendrait pas l'approbation .
De plus, s'il y a une fuite ou une violation (même si, techniquement, nous n'avons aucun accès à des informations sensibles, même dans notre propre application, il n'y a pas de nom ou d'informations d'identification sur l'utilisateur), cela pourrait toujours attirer une attention négative indésirable qui nuirait à la fois au client et nous.
Le problème est que le système créé par le tiers ne peut faire que des hachages SHA-1 non salés. Ma question est donc d'essayer de voir si nous pouvons contourner cela. Ou si nous sommes obligés de dire à mon client de forcer le tiers à mettre en œuvre un meilleur système de hachage, auquel il pourrait simplement répondre sans que nous ne le voulions pas. Ou cela pourrait coûter beaucoup plus cher.
J'espère que je l'ai expliqué un peu mieux tout en étant vague. :)
Oui, le hacher à nouveau avec bcrypt est une bonne idée. Notez cependant que cela ne donnera pas plus d'entropie à votre code de connexion, cela prendra juste plus de temps à se fissurer. Donc, si l'entropie est vraiment faible au début, vous devrez peut-être un facteur de coût très élevé pour le rendre impossible à craquer.
Sur une note latérale, en général, il est préférable de simplement hacher avec une bonne fonction de hachage que de jouer avec plusieurs, comme expliqué dans les réponses à cette question . Mais vous n'avez pas cette option, donc les arguments ne sont pas vraiment valables pour votre cas.
Quant à l'utilisation d'un poivre, je recommanderais simplement de chiffrer les hachages à la place. Il offre le même type de protection, mais offre plus de flexibilité. Mais il ne remplace pas le salage.
This and this pourrait être une lecture intéressante pour vous. En outre, Roshan Bhumbra a une suggestion intéressante sur le ressassement avec une seule fonction après la première connexion.
Dans votre système actuel, il semble que le mot de passe de facto soit le "hachage SHA-1 de ce code de connexion" car la possession d'un hachage correspondant est suffisante pour créer un fichier valide, bien qu'il ne soit pas clair s'il permet à l'attaquant d'exploiter quelque chose directement. Cependant, à cet égard, ce n'est pas moins sûr que d'envoyer simplement un mot de passe en clair - ce qui est approprié tant que vous "obtenez un fichier" via un canal sécurisé et crypté, c'est-à-dire https/sftp/etc.
Un risque avec ce système est que si un attaquant peut obtenir une copie de ce fichier, alors il peut obtenir les mots de passe complets des utilisateurs. SI vous avez besoin de stocker ces hachages, vous avez raison, il serait raisonnable de les hacher avec bcrypt pour le stockage, le principal problème étant que vous avez besoin pour être sûr que vous supprimez immédiatement le hachage SHA-1 reçu et qu'aucune copie de celui-ci (par exemple, les fichiers temporaires, les sauvegardes, les caches, etc.) ne reste dans le stockage.
Je vois une autre option qui ne semble pas avoir été mentionnée, bien que cela fonctionnerait mieux si le système qui génère le hachage pouvait utiliser un Bcrypt.
Vous avez juste besoin de mettre à jour le hachage lorsque l'utilisateur se connecte. Bien que cela signifie que vous aurez deux algorithmes de hachage différents en même temps, il contourne le "problème" mentionné par @Anders concernant l'utilisation de deux algorithmes sur une valeur.
Vous pouvez stocker une valeur à côté du hachage pour indiquer à l'application de quel type il s'agit, et s'il s'agit du hachage SHA-1, vous pouvez hacher le mot de passe qu'ils viennent d'entrer (à condition qu'il soit correct) et le stocker.
Si les hachages d'origine ne sont pas salés, vous pouvez simplement appliquer n'importe quel algorithme de hachage salé au hachage non salé d'origine que vous avez reçu.
Il est cependant important qu'il soit clairement indiqué dans votre base de données que ces hachages utilisent l'algorithme de hachage combiné. Il n'est pas tout à fait improbable qu'à une date ultérieure, différents utilisateurs de votre base de données soient sécurisés avec différents algorithmes de hachage. À ce moment-là, il est important que vous connaissiez la fonction correcte à utiliser pour chaque utilisateur de votre base de données.
Il est possible de mettre à niveau les hachages stockés dans votre base de données la prochaine fois que l'utilisateur se connecte. Bien que cela ne soit pas important car bcrypt n'est que légèrement plus sécurisé que SHA1 suivi de bcrypt.
Si les hachages d'origine sont salés, cela devient plus délicat. Dans ce cas, vous pouvez toujours appliquer deux couches de hachage, mais dans ce cas, il est très important de stocker tous les sels et uniquement la dernière valeur de hachage.