Je sais que tous les serveurs devraient au moins stocker mes informations d'identification sous la forme hash(password + salt)
+ salt
, avec une fonction sécurisée et bien connue hash
et une salt
unique pour moi, généré à partir d'une source sécurisée et bien connue.
Le problème est que les serveurs doivent le faire mais ne le peuvent pas, donc en tant qu'utilisateur, je ne peux pas leur faire confiance.
Je cherche ce que je peux faire pour mon mot de passe avant de l'envoyer au serveur, de sorte que si le serveur stocke du texte en clair par exemple, cela ne compromettra pas la sécurité de mon mot de passe sur d'autres serveurs.
Je pensais envoyer hash(password + service)
aux serveurs avec le service étant "Facebook"
Ou "Amazon"
Par exemple. De cette façon, si quelqu'un obtient hash(password + service)
stocké en texte brut à partir de ce service, c'est comme s'il avait trouvé le hachage de mon mot de passe + le sel, unique pour ce service.
Je vois déjà un problème avec cette idée: quelqu'un pourrait créer une table Rainbow pour chaque service, rendant l'utilisation du service comme un sel inutile.
Je connais la règle n'inventez pas votre propre crypto/protocole, c'est pourquoi je veux savoir s'il existe un protocole connu pour un client qui se sécurise?
Vous essayez de résoudre un problème que vous ne devriez pas avoir en premier lieu: Password Reuse
Le concept est simple. Vous pensez à un "bon" mot de passe et l'utilisez pour tout. Votre compte bancaire, vos achats en ligne, votre fournisseur de messagerie électronique, etc.
Le problème est que s'il est divulgué par l'un d'entre eux, tous les autres comptes sont potentiellement en danger. C'est un risque totalement inutile!
Vous avez vous-même dit de ne pas réinventer la roue. Si vous deviez réellement le faire, vous devrez soit écrire une application qui calcule les hachages pour vous, soit les calculer vous-même et les stocker.
Il existe déjà des applications qui résolvent le problème du stockage des informations d'identification, et elles font un bien meilleur travail: les gestionnaires de mots de passe hors ligne
Parce qu'ils génèrent des mots de passe vraiment aléatoires et uniques. Il n'est pas nécessaire d'y intégrer la cryptographie. Pas besoin de lier mon mot de passe pour mon compte e-mail contenant en quelque sorte la chaîne "gmail.com".
Parce que SN2\ZJ2Cw92DQx^{$OmqAC_P'xR|Md)[
est certainement un meilleur mot de passe que la somme MD5 de hunter2+gmail.com
(c'est 01f9a94a0febf268495d08f5960e7f05
, au cas où vous vous poseriez la question).
La solution établie à ce problème consiste à utiliser différents mots de passe pour différents sites Web avec un gestionnaire de mots de passe. De cette façon, vous n'aurez pas à réinventer la roue.
Je sais que la règle n'invente pas votre propre crypto/protocole, c'est pourquoi je veux savoir s'il existe un protocole connu pour un client qui se sécurise?
Tous les problèmes ne doivent pas être résolus par une solution technique trop compliquée.
Ne pas réutiliser le mot de passe est une solution élégante.
J'avais l'habitude d'utiliser une extension de navigateur qui faisait à peu près exactement ce que vous proposiez. (Il a fallu mon mot de passe réel + l'URL du site, les a hachés ensemble et a généré un mot de passe à partir de cela). C'était génial ... jusqu'à ce qu'eBay me fasse changer de mot de passe parce qu'ils avaient divulgué leur base de données. À ce stade, je devais me rappeler quels sites utilisaient un mot de passe et quel autre.
Le problème supplémentaire est que si un site avait stocké mon "mot de passe" en texte brut, un attaquant aurait pu reconnaître comment mon mot de passe avait été généré et le craquer.
Le dernier problème concerne les sites comme Amazon.de, Amazon.co.uk et Amazon.com qui doivent tous partager un mot de passe.
Je suis passé à un gestionnaire de mots de passe (LastPass) sécurisé avec un mot de passe fort, généré aléatoirement (diceware) (et 2FA sur mes comptes importants).
Je sais que la règle n'invente pas votre propre crypto/protocole, c'est pourquoi je veux savoir s'il existe un protocole connu pour un client qui se sécurise?
Le problème que vous rencontrez dans l'espace d'ingénierie de sécurité est connu sous le nom de modèle "Mot de passe gourmand" . Chaque site Web que vous visitez pense que c'est le seul site sur l'ensemble du Web et ils pensent qu'il est OK de vous demander de gérer/mémoriser des mots de passe complexes. Voir également Peter Gutmann Engineering Security.
Vous pouvez faire comme @ MechMK1 le suggère et utiliser Password Manager. Le problème est qu'il déplace simplement le problème de mot de passe et le rend un peu plus facile à gérer. Vous devez toujours utiliser un vrai mot de passe à un moment donné. Dans un cadre de gestion des risques, vous avez réduit les risques mais ne les avez pas éliminés.
Vous devez utiliser des mots de passe jetables pour chaque compte non critique. J'utilise personnellement Strong Random Password Generator pour générer des mots de passe aléatoires de 32 octets pour chaque site gourmand. Avec humour - d'une manière morbide - certains sites ne peuvent pas gérer les mots de passe aléatoires longs ou complexes. Certains sites vous font fournir un mot de passe plus faible.
Une fois que vous vous connectez à un site, ils vous donnent un jeton (cookie) pour le site dont vous n'avez plus besoin du mot de passe. Si vous avez besoin de ressaisir le mot de passe, laissez le navigateur le saisir à partir du magasin d'informations d'identification.
Si le mot de passe ne se trouve pas dans le magasin d'informations d'identification, passez simplement par le processus "Password Recover Password". Le site vous enverra un e-mail, et vous pouvez utiliser le processus pour définir un autre mot de passe à jeter. Je l'utilise tout le temps pour les cookies expirés.
Le lien envoyé dans l'e-mail du processus de récupération est appelé "URL d'auto-authentification" . Je crois que Python utilise un similaire pour authentifier les packages. Voir aussi Peter Gutmann's Engineering Security .
Plusieurs comptes seront suffisamment importants pour que vous ayez besoin d'un vrai mot de passe. Par exemple, le mot de passe de votre entreprise et le mot de passe de votre compte de messagerie {Gmail | Yahoo | Hotmail | Apple | Microsoft | etc}. Pour eux, utilisez un mot de passe fort et notez-le afin qu'il ne soit pas perdu ou oublié. Mettez ensuite le mot de passe dans votre portefeuille ou votre sac à main. Encore mieux, configurez 2FA pour les comptes critiques afin que l'attaquant ait besoin à la fois de votre mot de passe + OTP/token.
Certains services, comme Spotify, envisagent de supprimer tous les mots de passe ensemble. Ils adaptent le "processus de récupération de mot de passe" pour l'authentification. Lorsque vous souhaitez vous connecter, vous entrez votre adresse e-mail et ils vous envoient un lien pour un jeton. Vous n'avez plus besoin d'un mot de passe - vous avez juste besoin d'un compte de messagerie.
La principale menace est l'attaquant du réseau, et ils n'ont pas réussi à atteindre votre moniteur et à lire vos notes post-it. S'ils s'introduisent dans votre gestionnaire de mots de passe ou dans votre magasin d'informations d'identification de navigateur, laissez-les collecter autant de mots de passe jetables qu'ils le souhaitent.
Je cherche ce que je peux faire avec mon mot de passe avant de l'envoyer au serveur ... Je pensais envoyer du hash (mot de passe + service) aux serveurs
Si vous aimez faire ce genre de choses (analyse des risques, modélisation des attaques, etc.), alors vous devriez lire Peter Gutmann's Engineering Security. Sa thèse de doctorat a étudié la sécurité et le comportement des utilisateurs. Son livre est un traitement pour la construction de systèmes plus sûrs et plus sécurisés.
Je ne répondrai qu'aux aspects cryptographiques de votre raisonnement; pour des discussions sur les implications de sécurité d'un mot de passe maître sans état, voir les autres réponses.
Conceptuellement, votre idée est bonne. Ce serait correct dans le modèle Oracle aléatoire, où les fonctions de hachage ont des sorties indépendantes pour partiellement une entrée identique. Cependant, dans le monde réel, nos fonctions de hachage ont des limites et peuvent être vulnérables aux attaques d'extension.
Le risque, ici, serait qu'un adversaire puisse voler la sortie H(key + service1)
pour un service compromis et trouver un moyen plus efficace de générer H(key + service2)
, qui ne nécessite pas de récupérer complètement password
.
Pour cette raison, nous n'utiliserions pas hash(key + service/salt)
comme primitive. Au lieu de cela, nous utiliserions une fonction Code d'authentification de message , MAC(key, service)
. Les fonctions MAC sont spécialement conçues pour éviter ce problème.
https://getvau.lt/ semble répondre exactement à votre question, il hachera votre mot de passe avec le nom du site en vous donnant un mot de passe unique pour chaque site tout en vous permettant de n'en retenir qu'un.
Personnellement, je recommanderais toujours un gestionnaire de mots de passe, mais si vous insistez ...
Comme d'autres l'ont dit, vous ne devriez pas réutiliser votre mot de passe, mais j'ajouterais également que vous ne devriez pas réutiliser votre identifiant. Si la création est sous votre contrôle, utilisez quelque chose de aléatoire pour chacun: -
Serveur 1, ID: bluecanary81 Mot de passe: isoudi £ & 8r902) 38rficsu78
Serveur 2, ID: tuliptop19 Mot de passe: uiouew893 £ * (2dferff $ () _ 5
etc.
Si le système insiste sur une adresse e-mail, procurez-vous votre propre domaine et utilisez [email protected] pour le serveur 1, [email protected] pour le serveur 2, etc.
De cette façon, même si quelqu'un obtient vos informations d'identification, aucun autre système n'est exposé.
La question que vous devez vous poser est ce que vous essayez de réaliser?
Vous avez dit que vous souhaitez avoir un mot de passe unique, que vous allez hacher avec:
Hash (mot de passe + service) le hachage résultant, en fonction de l'algorithme utilisé (indice: ne créez pas votre propre algorithme), comportera probablement 32 caractères.
Le premier problème est de voir: et si le site Web ne vous permet pas d'utiliser un mot de passe de 32 caractères?
Deuxième problème: prévoyez-vous de vous souvenir de ces mots de passe longs pour chaque site Web différent? Si vous prévoyez de les enregistrer quelque part, l'utilisation d'un gestionnaire de mots de passe pour créer un mot de passe unique, aléatoire et de 10 caractères, que vous n'utiliserez pour aucun autre site Web est à la fois plus facile et plus sécurisé.
Si vous prévoyez de vous souvenir de ces mots de passe longs de 32 caractères, il est encore plus facile de se souvenir d'un mot de passe unique de 10 caractères.
Pour revenir à ma question initiale: qu'essayez-vous de réaliser?
Saler et hacher le mot de passe dans la base de données est une couche de sécurité afin que:
Si l'attaquant a compromis silencieusement le service que vous utilisez et a un accès complet, il peut simplement voler votre sessionID pour vous impersonnaliser, il peut modifier le comportement de l'application afin que votre mot de passe en texte clair lui soit envoyé avant le hachage, il peut changer votre mot de passe haché dans la base de données avec son propre mot de passe haché, connectez-vous avec son mot de passe, puis modifiez le mot de passe de la base de données en votre mot de passe haché ... il est fondamentalement propriétaire du système et VOUS ne pouvez rien y faire.
En hachant et en salant le mot de passe, le service/site que vous utilisez n'essaient pas de les protéger, ils essaient de protéger vos autres comptes au cas où ils seraient compromis.