Chiffrement/Hachage de texte en clair les mots de passe en base de données
J'ai hérité une application web que je viens de découvrir les magasins de plus de 300 000 noms d'utilisateur/mots de passe en clair dans une base de données SQL Server. Je me rends compte que c'est une Très Mauvaise Chose™.
Sachant que je vais mettre à jour le login et le mot de passe de processus de mise à jour pour crypter/décrypter, et avec le plus petit impact sur le reste du système, que recommanderiez-vous comme le meilleur moyen de supprimer le texte en clair les mots de passe de la base de données?
Toute aide est appréciée.
Edit: Désolé si je n'était pas clair, je voulais vous demander quel serait votre procédure pour crypter/hachage du mot de passe, pas de chiffrement/méthodes de hachage.
Dois-je simplement:
- Faire un backup de la DB
- Mise à jour de l'ouverture/mise à jour le mot de passe de code
- Après les heures de travail, aller à travers tous les enregistrements dans la table de hachage du mot de passe et le remplacement de chacun
- De Test pour s'assurer que les utilisateurs peuvent toujours login/mise à jour des mots de passe
Je suppose que mon problème est plus du nombre d'utilisateurs, donc je veux m'assurer que je suis en train de faire cela correctement.
- Très Mauvaise Chose(tm) 🙂
- Je ne pense pas que vous avez travaillé à vos question. Vous voulez savoir comment obtenir les données d'une base de données relationnelle? Que serait une instruction select.
- Je sais comment récupérer des documents, c'est plus une question de procédure... Désolé si c'était pas clair.
- Avez-vous mis la main sur le Reddit utilisateur DB? 😉
- Double Possible de Sécuriser le Hachage de Mot de passe
- Je ne suis pas sûr de savoir comment cet enfant de 7 ans question avec plus de 34 000 points de vue est un doublon de 6 ans question avec moins de 5 000 points de vue, mais apparemment, vous pensez qu'elle est. Je suis d'accord que je ne voudrais pas demander à ce qu'une nouvelle question sur DONC, aujourd'hui, mais cela a été demandé avant toutes les autres émissions liées à la Pile de sites d'Échange de l'existence. La question elle-même est plus sur le processus de migration à partir de texte brut, plus sûrs, les mots de passe, pas de la mise en œuvre spécifique de chiffrement/méthodes de hachage.
- Tout simplement parce que nous avons laissé les doublons de rester pour quelques années ne signifie pas que nous devrions les garder ouverts quand nous les trouvons. Et je ne vois pas comment l'existence d'autres sites SE sont pertinentes.
- Aussi, puisque vous êtes toujours là, je suggère de commutation de la accepté de répondre à un bon one — pas celle qui prétend que les mots de passe sont “crypté”, ou que MD5 est un bon choix pour un hachage de mot de passe. stackoverflow.com/a/287883 et stackoverflow.com/a/287738 sont les meilleures réponses qu'ils ont laissé sur un hash du mot de passe doit être salé et lent.
- Ma mention d'autres SE sites était de répéter que c'était plus d'un processus/procédure de question que j'aurais sans doute demandé sur programmers.stackexchange.com s'il avait existé quand j'ai demandé à l'origine. Je ne pense pas que ce soit un doublon que je n'ai pas demandé algorithme de hachage doit être utilisé. L'actuel accepté réponse a été la meilleure réponse à l'époque que la question d'un processus de migration de texte clair des mots de passe pour plus de sécurité mise en œuvre.
Vous devez vous connecter pour publier un commentaire.
J'imagine que vous devez ajouter une colonne à la base de données pour le mot de passe crypté, puis exécutez un lot de travail au-dessus de tous les enregistrements qui obtient le mot de passe actuel, le chiffre (comme d'autres l'ont mentiond un hachage comme md5 est assez standard edit: mais ne doit pas être utilisé sur son propre - voir les autres réponses pour de bonnes discussions), le stocke dans la nouvelle colonne et vérifie tout cela s'est fait en douceur.
Ensuite, vous devrez mettre à jour votre front-end de hachage de passe saisi par l'utilisateur au moment de la connexion et vérifiez que vs le hash stocké, plutôt que de vérifier en clair-vs-texte en clair.
Il semblerait prudent de me laisser les deux colonnes de la place pour un peu de temps pour s'assurer que rien n'hinky, a connu, avant de finalement retirer les mots de passe en clair tous ensemble.
Ne pas oublier aussi qu'à chaque fois que le mot de passe s'effectue le code de changement, tels que le changement de mot de passe /rappel des demandes. Vous aurez bien sûr de perdre la capacité de email mot de passe oublié, mais ce n'est pas une mauvaise chose. Vous aurez à utiliser un mot de passe de réinitialisation du système à la place.
Edit:
Un dernier point, vous pouvez envisager d'éviter l'erreur que j'ai faite lors de ma première tentative à un banc d'essai de connexion sécurisée du site web:
Lors du traitement du mot de passe utilisateur, envisager où la de hachage prend place. Dans mon cas, le hash est calculé par le code PHP en cours d'exécution sur le serveur, mais le mot de passe a été transmis à la page à partir de la machine de l'utilisateur en clair! C'était ok(ish) dans l'environnement, j'ai travaillé en, car elle était à l'intérieur d'un https système de toute façon (uni en réseau). Mais, dans le monde réel, j'imagine que vous voulez de hachage du mot de passe avant qu'il ne quitte le système de l'utilisateur, à l'aide de javascript etc. et puis de transmettre le hash de votre site.
MODIFIER (2016): utilisation Argon2, scrypt, bcrypt, ou PBKDF2, dans cet ordre de préférence. Utiliser un facteur de ralentissement que possible pour votre situation. Utiliser une approuvés de mise en œuvre existantes. Assurez-vous d'utiliser un bon sel (bien que les bibliothèques que vous utilisez doit être bien sûre de le faire pour vous).
Lorsque vous hachage de mots de passe à utiliser NE PAS UTILISER de PLAINE MD5.
Utilisation PBKDF2, ce qui signifie fondamentalement à l'aide d'un hasard de sel pour éviter table arc-en-ciel attaques, et d'itération (re-hachage) assez de temps pour ralentir le hachage baisse pas tant que votre application prend trop de temps, mais assez qu'un attaquant brute-forcer un grand nombre de mot de passe différent remarquerez
À partir du document:
Exemple d'implémentation en Python, en utilisant SHA-256 secure hash:
MODIFIER: comme mentionné par Eli Collins ce n'est pas un PBKDF2 mise en œuvre. Vous devriez préférer les implémentations qui collent à la norme, comme la PassLib.
La stratégie de base consiste à utiliser une fonction de dérivation de clé de "hachage" le mot de passe avec un peu de sel. Le sel et le résultat du hachage sont stockées dans la base de données. Lorsqu'un utilisateur entre un mot de passe, le sel et leurs commentaires sont hachés et de la même façon par rapport à la valeur stockée. Si elles correspondent, l'utilisateur est authentifié.
Le diable est dans les détails. D'abord, cela dépend beaucoup de l'algorithme de hachage qui est choisi. Une dérivation de clé algorithme de type PBKDF2, basé sur une base de hachage code d'authentification de message, la rend "mathématiquement impossible" de trouver une entrée (dans ce cas, un mot de passe) qui va produire une donnée de sortie (ce qu'un attaquant a trouvé dans la base de données).
Un pré-calculées d'attaque par dictionnaire utilise de pré-calculées de l'indice, ou de dictionnaire, à partir de hachage sorties pour les mots de passe. Le hachage est lent (ou il est censé être, de toute façon), donc l'attaquant de hachages toutes les chances de mots de passe une fois, et stocke le résultat indexés de manière telle que la donnée d'une table de hachage, il peut chercher un mot de passe correspondant. C'est un classique compromis à trouver de l'espace pour le temps. Depuis listes de mots de passe peut être énorme, il ya des façons de régler le compromis (comme rainbow tables), de sorte qu'un attaquant peut donner un peu de vitesse pour gagner beaucoup d'espace.
Pré-calcul attentats sont déjoués par l'aide de "chiffrement de sel". C'est quelques données qui est haché avec le mot de passe. Il n'a pas besoin d'être un secret, il a juste besoin d'être imprévisible pour un mot de passe donné. Pour chaque valeur de sel, un attaquant aurait besoin d'un nouveau dictionnaire. Si vous utilisez un octet de sel, un attaquant doit 256 exemplaires de leur dictionnaire, chaque produit avec un autre sel. D'abord, il faudrait utiliser le sel pour la recherche de la bonne dictionnaire, alors qu'il avait utiliser le hachage de sortie pour rechercher un mot de passe utilisable. Mais que faire si vous ajoutez 4 octets? Maintenant il a besoin de 4 milliards de copies de la le dictionnaire. En utilisant un assez gros sel, une attaque par dictionnaire est interdit. Dans la pratique, de 8 à 16 octets de données à partir d'un chiffrement de qualité générateur de nombre aléatoire qui fait un bon sel.
Avec pré-calcul de la table, un attaquant a besoin de calculer la valeur de hachage sur chaque tentative. Combien de temps il faut pour trouver un mot de passe dépend désormais entièrement sur combien de temps il faut pour hacher un candidat. Ce temps est augmenté par l'itération de la fonction de hachage. Le nombre d'itérations est généralement un paramètre de la fonction de dérivation de clé; aujourd'hui, un grand nombre d'appareils mobiles utilisent de 10 000 à 20 000 itérations, alors qu'un serveur peut utiliser 100 000 habitants ou plus. (Le bcrypt algorithme utilise le terme "facteur de coût", qui est une mesure logarithmique du temps requis.)
Suivre Xan conseils de garder le mot de passe actuel autour de la colonne pour un certain temps donc, si les choses tournent mal, vous pouvez la restauration rapide-n-facile.
Aussi loin que le chiffrement de vos mots de passe:
Voir Thomas Ptacek de Assez Avec Les Tables Arc-En-Ciel: Ce Que Vous Devez Savoir Sur Les Régimes De Mot De Passe Sécurisé pour certains détails.
Je pense que vous devriez faire ce qui suit:
C'était un problème de mine il ya quelques semaines.
Nous avons été le déploiement d'un grand projet MIS à 975 différents lieux géographiques où nos propres informations d'identification des utilisateurs magasin sera utilisé comme un authentificateur de jeu différent de déjà mises en œuvre et à l'utilisation des applications. Nous avons déjà fourni à la fois le REPOS et du SAVON à base d'authentification de service, mais le client a insisté pour être en mesure d'atteindre l'utilisateur banque d'informations d'identification à partir d'autres applications avec juste une connexion DB à vue en lecture seule de la table ou de la vue. Soupir... (ce très couplé mauvaise décision de conception est un objet d'une autre question).
Qui nous a forcé de s'asseoir et de convertir nos salé et de manière itérative hachage de mot de passe de stockage de régime à un cahier des charges et de fournir des différentes implémentations de langue pour une intégration facile.
Nous l'avons appelé Assez Sécurisé des mots de passe Hachés ou FSHP en bref.
Mis en œuvre en Python, Ruby, PHP5 et l'a publié dans le Domaine Public. Disponible à être consommés, fourche, flammé ou de cracher sur GitHub à http://github.com/bdd/fshp
FSHP est un salée, de manière itérative hachage hachage de mot de passe de mise en œuvre.
Principe de conception est similaire avec PBKDF1 de la spécification RFC 2898
(un.k.un: PKCS #5: Mot de passe-Cryptographie Basé sur la Spécification de la Version 2.0.)
FSHP permet de choisir le sel de la longueur, le nombre d'itérations et le
sous-jacent fonction de hachage cryptographique parmi SHA-1 et SHA-2 (256, 384, 512).
Auto-définition de méta préfixe au début de chaque sortie le rend portable tout en permettant au consommateur de choisir son propre mot de passe de stockage de sécurité de base.
De SÉCURITÉ:
Par défaut FSHP1 utilise 8 octets sels, avec 4096 itérations de hachage SHA-256.
- 8 octets sel rend la rainbow table des attaques peu pratique en multipliant les
espace requis avec 2^64.
- 4096 itérations causes des attaques de force brute être assez cher.
- Il n'y a pas d'attaques connues contre SHA-256 pour trouver les collisions avec
un effort de calcul de moins de 2^128 opérations au moment de l'
cette version.
IMPLÉMENTATIONS:
Tout le monde est le bienvenu pour créer manquant implémentations de langue ou de
polonais actuel.
FONCTIONNEMENT de BASE (avec Python):
PERSONNALISATION DE LA CRYPTE:
Nous allons affaiblir notre hachage de mot de passe système.
- Diminuer le sel de la longueur par défaut de 8 à 2.
- Diminution de l'itération tour de défaut 4096 à 10.
- Sélectionnez FSHP0 avec l'algorithme SHA-1 de sous-jacent à l'algorithme de hachage.
Comme d'autres l'ont mentionné, vous ne voulez pas à déchiffrer si vous pouvez l'aider. Norme de meilleure pratique consiste à chiffrer à l'aide d'un hachage à sens unique, et puis quand l'utilisateur ouvre une session dans le hachage de mot de passe pour la comparer.
Sinon, vous devrez utiliser un chiffrement fort pour crypter et décrypter. Je ne pourrais que recommander cet si les raisons politiques sont fortes (par exemple, vos utilisateurs sont habitués à être en mesure d'appeler le service d'assistance pour récupérer son mot de passe, et vous avez une forte pression à partir du haut de ne pas changer cela). Dans ce cas, j'aimerais commencer avec le chiffrement et puis commencer à construire un business case pour déplacer de hachage.
À des fins d'authentification, vous devriez éviter de stocker les mots de passe en utilisant un chiffrement réversible, c'est à dire vous ne devez stocker le hachage de mot de passe et vérifier le hash de l'utilisateur-mot de passe fourni avec le hachage que vous avez stockées. Cependant, cette approche a un inconvénient: il est vulnérable à la table arc-en-ciel attaques, si un attaquant d'obtenir votre mot de passe de base de données de banque.
Ce que vous devez faire est de stocker les valeurs de hachage de pré-choisi (et secret) de sel de la valeur + le mot de passe. I. e., concaténer le sel et le mot de passe, le résultat de hachage, et de stocker ces hachage. Lors de l'authentification, procédez de la même concaténer votre sel de la valeur et de l'utilisateur-mot de passe fourni, de hachage, puis vérifier l'égalité. Cela rend arc-en-ciel de la table des attaques irréalisable.
Bien sûr, si l'utilisateur d'envoyer des mots de passe sur le réseau (par exemple, si vous travaillez sur un site web ou une application client-serveur), alors vous ne devriez pas envoyer le mot de passe en texte clair à travers, de sorte qu'au lieu de stocker de hachage(sel + mot de passe), vous devez stocker et vérifier à l'encontre de hachage(sel + hash(mot de passe)), et demandez à votre client de pré-hachage de l'utilisateur-mot de passe fourni et envoyer que un à travers le réseau. Cela protège l'utilisateur de votre mot de passe ainsi, si l'utilisateur (comme beaucoup le font) ré-utiliser le même mot de passe pour plusieurs fins.
Étape 1: Ajouter chiffré champ de base de données
Étape 2: Modifier le code de sorte que lorsque le mot de passe est changé, il met à jour les champs, mais la journalisation en utilise encore l'ancien champ.
Étape 3: Exécution de script pour remplir tous les champs.
Étape 4: Modifier le code de sorte que la coupe de bois dans les utilisations nouvelles de champ et de modification des mots de passe s'arrête la mise à jour de l'ancien champs.
Étape 5: Supprimer les mots de passe non cryptés dans la base de données.
Cela devrait vous permettre d'accomplir le passage sans interruption pour l'utilisateur final.
Aussi:
Quelque chose que je ferais est le nom de la nouvelle base de données de champ de quelque chose qui est complètement sans rapport avec le mot de passe comme "LastSessionID" ou quelque chose de même ennuyeux. Alors au lieu de supprimer le mot de passe champ, il suffit de remplir avec des tables de hachage de données aléatoires. Ensuite, si votre base de données n'est jamais compromise, ils peuvent passer tout le temps qu'ils veulent essayer de déchiffrer le champ "password".
Cela peut ne pas accomplir quoi que ce soit, mais c'est amusant de penser à quelqu'un assis là, à essayer de comprendre sans valeur d'information
Comme avec toutes les décisions de sécurité, il y a des différences. Si vous hachage du mot de passe, ce qui est probablement votre plus facile de se déplacer, vous ne pouvez pas offrir une récupération de mot de passe la fonction qui renvoie le mot de passe d'origine, ni de votre personnel de l'oeil d'une personne à un mot de passe afin d'accéder à leur compte.
Vous pouvez utiliser le chiffrement symétrique, qui a ses propres inconvénients. (Si votre serveur est compromis, la clé de chiffrement symétrique peut être compromise aussi).
Vous pouvez utiliser de chiffrement à clé publique, et d'exécuter récupération de mot de passe/service client sur une autre machine qui stocke la clé privée en isolement à partir de l'application web. C'est le plus sûr, mais nécessite un deux-architecture de la machine, et probablement un pare-feu entre les deux.
Je ne suis pas un expert en sécurité, mais je htink la recommandation actuelle est d'utiliser bcrypt/blowfish ou SHA-2 variante, pas de MD5 /SHA1.
Probablement vous avez besoin de penser en termes d'un plein d'audit de sécurité, trop
MD5 et SHA1 ont montré un peu de faiblesse (en deux mots peuvent entraîner dans le même hash) donc, en utilisant SHA256-SHA512 /itératif hachages est recommandé de hacher le mot de passe.
Je voudrais écrire un petit programme dans la langue que l'application est écrite dans ce va et génère de façon aléatoire un sel qui est unique pour chaque utilisateur et un hachage du mot de passe. La raison j'ai tendance à utiliser le même langage que la vérification est que les différentes bibliothèques de chiffrement peut faire les choses de façon légèrement différente (c'est à dire de remplissage) donc, en utilisant la même bibliothèque pour générer le hachage et de vérifier qu'il élimine ce risque. Cette application peut aussi puis vérifier la connexion après le tableau a été mis à jour si vous voulez qu'il connaît la plaine de texte mot de passe encore.
Je voudrais suggérer une amélioration à le grand exemple python posté par Orip. Je voudrais redéfinir le
random_bytes
de la fonction:Bien sûr, vous devez importer le
os
module. Leos.urandom
fonction fournit une séquence aléatoire d'octets qui peut être utilisé en toute sécurité dans les applications cryptographiques. Voir la référence de l'aide de cette fonction pour plus de détails.De hachage du mot de passe, vous pouvez utiliser le HashBytes fonction. Retourne un varbinary, de sorte que vous devez créer une nouvelle colonne, puis supprimez l'ancien varchar un.
Comme
Ensuite, vous modifiez le code pour valider le mot de passe, à l'aide d'une requête comme
où <mot de passe> est la valeur entrée par l'utilisateur.
de hachage avec md5. c'est ce qui est généralement fait avec des mots de passe.