Cryptage du mot de passe

Je crée un écran de connexion pour une application en C #. Dans mon écran de connexion, je lis le nom d’utilisateur et le mot de passe de la firebase database et vérifie si le nom d’utilisateur et le mot de passe saisis sont corrects ou non. J’ai besoin du mot de passe pour chiffrer pendant que je lis le mot de passe de la firebase database. Quelqu’un peut-il expliquer le fonctionnement du cryptage et du décryptage?

  1. Si je dois stocker la valeur cryptée dans la firebase database pour la lecture.
  2. En ce moment j’ai deux champs

    column names: username password values: admin password 
  3. Devrais-je stocker la valeur chiffrée du mot de passe dans un autre champ de la table de connexion?

Premièrement: l’approche courante consiste maintenant à stocker le hachage du mot de passe, au lieu du mot de passe en clair (SHA-1 et un meilleur algorithme de hachage sont préférables, évitez MD5 car il n’est plus sûr.). Lorsque l’utilisateur se connecte, vous recalculez le hachage de la chaîne d’entrée, puis vous le comparez à la chaîne stockée dans la firebase database.

EDIT: pourquoi ne devriez-vous pas utiliser le cryptage pour mot de passe? Parce que lorsque l’attaquant connaît la clé de cryptage, tous vos mots de passe seront exposés (c’est très mauvais). Si vous utilisez du hasch, il ne peut que deviner un par un (et ce n’est pas facile). Sinon, les algorithmes de hachage, en général, sont plus rapides que le cryptage, vous en tirerez un avantage en termes de performances.

EDIT: pourquoi devriez-vous stocker du hasch salé au lieu d’un hash? Parce que les algorithmes de hachage sont garantis, si vous hachez des chaînes identiques, le résultat est le même. Cela peut entraîner un problème, c’est que lorsque l’attaquant voit les mêmes valeurs de hachage, il peut deviner que les textes étaient identiques, ce qui lui donne la chance d’obtenir le mot de passe d’origine.

Salt signifie qu’en plus du texte d’origine, vous mettez du texte aléatoire. Par conséquent, deux chaînes identiques génèrent des valeurs de hachage différentes.

Jetez un oeil à ceci: http://www.obviex.com/samples/hash.aspx

Si l’utilisateur oublie son mot de passe, vous pouvez utiliser la fonction de réinitialisation du mot de passe, utilisée par de nombreux sites:

  1. L’utilisateur demande une réinitialisation du mot de passe
  2. Un e-mail contenant un lien spécial (comprenant un jeton secret / un code PIN) sera envoyé à l’adresse e-mail enregistrée, qui permet à l’utilisateur de réinitialiser son mot de passe.
  3. Un mot de passe créé de manière aléatoire sera à nouveau envoyé à l’utilisateur, qui pourra ensuite se connecter et modifier son mot de passe.

MISE À JOUR 14 mai 2012: La réponse semble être ancienne et pas tout à fait vraie. Les gens se tournent vers un algorithme de cryptage de hachage plus sécurisé pour stocker le mot de passe. Une des solutions notables est maintenant bcrypt, et une autre (nouvelle et prometteuse) est scrypt.

L’avantage de ces cryptages? Ils sont lents! Beaucoup plus lent que l’algorithme de hachage. Avec la puissance du GPU (par exemple, CUDA de nVidia), il n’est plus impossible de déchiffrer la valeur de hachage, et la lenteur peut rendre beaucoup plus difficile le déchiffrement de ce cryptage.

Vous pouvez en savoir plus sur bcrypt à l’ adresse suivante : http://codahale.com/how-to-safely-store-a-password/

Deuxièmement: vous devez séparer la table des utilisateurs (contient les profils de l’utilisateur, tels que le nom complet, la DoB, l’adresse, …) et la table des connexions (qui contient le nom d’utilisateur et le mot de passe, ainsi que certains atsortingbuts spéciaux). Cela conduira à une meilleure gestion et réduira le risque d’exposition d’informations sensibles

Outre les conseils donnés, il existe d’autres méthodes pour protéger les mots de passe:

  1. Mot de passe à usage unique: Malgré l’implémentation du hachage salé, les mots de passe sont toujours stockés sur le disque dur et sont susceptibles d’être déchirés. Donc, une meilleure approche est nécessaire ici. Contrairement aux mots de passe statiques, les mots de passe à usage unique sont modifiés chaque fois qu’un utilisateur ouvre une session sur le système. Les utilisateurs doivent généralement emporter un petit matériel utilisé pour la synchronisation avec le serveur. Il existe principalement deux types d’OTP: (Visitez l’ authentification plus sûre avec un mot de passe à usage unique )

    • Synchronisé dans le temps
    • Contre-synchronisé
  2. Utilisation de BCrypt, qui utilise une variante du programme de chiffrement de l’algorithme de chiffrement Blowfish et contient un facteur de travail, qui vous permet de déterminer le coût de la fonction de hachage. Pour vous familiariser avec bCrypt, visitez: http://codahale.com/how-to-safely-store-a-password/

En C #, vous pouvez utiliser la bibliothèque BCrypt.Net, qui est un port de la bibliothèque iBCrypt: lisez l’article suivant pour comprendre comment utiliser cette bibliothèque dans Visual Studio.Net:

Utilisation de BCrypt dans une application .NET – Pourquoi c’est meilleur que SHA ou MD5.

Bien sûr, il y a beaucoup de discussions sur cet algorithme dans SO, cherchez et étudiez plus à ce sujet.

Implémentez-vous votre propre mécanisme d’authentification? Vous pouvez utiliser l’authentification existante System.Web.Security Microsoft. En utilisant la classe d’appartenance, vous pouvez valider le mot de passe de l’utilisateur sans le récupérer à partir de la firebase database. De cette façon, vous pourrez stocker le mot de passe salé (crypté) dans votre firebase database. Il suffit d’utiliser Membership.CreateUser et Membership.ValidateUser. Si vous n’avez pas besoin (en termes de performances ou d’implémentation propriétaire), utilisez les implémentations existantes et gagnez du temps.

Le mot de passe doit être stocké dans la firebase database avec la valeur cryptée elle-même. Et lorsque l’utilisateur tente de se connecter, chiffrez le mot de passe avec le même algorithme, puis comparez-le à la valeur en firebase database.

Md5 est généralement utilisé pour le chiffrement du mot de passe car il ne peut pas être déchiffré. Si l’utilisateur oublie le mot de passe, il ne peut pas le récupérer, mais il ne peut être réinitialisé.

J’espère que cela t’aides !

Vous pouvez chiffrer les mots de passe de plusieurs façons.

L’un des moyens consiste à utiliser le cryptage MD5. Laissez-moi vous montrer l’une des méthodes de cryptage que j’utilise.

 #region Encrypt public ssortingng Encrypt(ssortingng simpletext, ssortingng keys) { try { XCryptEngine xe = new XCryptEngine(); xe.Algorithm = XCrypt.XCryptEngine.AlgorithmType.DES; //DES = Data Encryption Standard ssortingng cipher = xe.Encrypt(simpletext, keys); if (cipher != null) return (cipher); else return null; } catch (Exception ex) { throw ex; } } #endregion #region Decrypt public ssortingng Decrypt(ssortingng simpletext, ssortingng keys) { try { XCryptEngine xe = new XCryptEngine(); xe.Algorithm = XCrypt.XCryptEngine.AlgorithmType.DES; //Console.WriteLine(xe.Decrypt(simpletext, keys)); simpletext = simpletext.Replace(" ", "+"); ssortingng cipertext = xe.Decrypt(simpletext, keys); if (cipertext != null) return (cipertext); else return null; } catch (Exception ex) { throw ex; } } #endregion 

vous devez utiliser une référence pour XCrypt pour l’utiliser.

 using XCrypt;