Mot de passe SecureSsortingng stocké dans la database

Je crois que je ne comprends pas une partie fondamentale de SecureSsortingng . Je comprends que les ssortingng sont immuables et qu'un mot de passe ou des données sensibles sont trouvés comme text clair sur le tas.

Ce que j'ai du mal à comprendre, c'est comment utiliser SecureSsortingng dans une application client qui doit vérifier le mot de passe haché dans une database?

Voici mon context:

  • J'utilise une application client WPF.
  • J'ai une database SQL locale (sur la machine du client)
  • Les passwords sont hachés et stockés dans la database.
  • L'user essaie de se connecter à mon application WPF
  • Le contrôle PasswordBox stocke le mot de passe dans un SecureSsortingng via la propriété SecurePassword .

Maintenant quoi? Comment puis-je hacher un SecureSsortingng SANS le renvoyer dans une string en premier?

Tous les conseils que j'ai reçus jusqu'ici sont d'écrire des methods d'extension convertissant SecureSsortingng en Ssortingng , de le hacher puis de l'envoyer à db pour vérifier. Mais cela vainc tout l'exercice!

SecureSsortingng je juste accepter que SecureSsortingng est inutile dans mon context mentionné et utiliser une ssortingng simple?

SecureSsortingng est représenté par un octet [] vous pouvez encoder les octets par exemple avec bitconverter et save le résultat. En outre SecureSsortingng est un encryption pas un hachage car il peut être déchiffré. (voir ci-dessous)

SecureSsortingng principalement destiné à stocker des données sensibles en memory . Si vous avez un service / site Web, ce n'est pas aussi important que les valeurs qui sont stockées dans la database. Ceux-ci ne devraient jamais être en clair, et ne pas être décryptables par votre administrateur ou par un administrateur. Je ne suis pas certain qu'un autre server pourrait déchiffrer les strings, vous pourriez avoir un problème lorsque vous changez de server ou que vous avez des problèmes de cluster.

En particulier pour les passwords préfèrent utiliser des algorithms de hachage (par exemple SHA256 ). Ceux-ci ne peuvent pas être cryptés (comme la sum des numbers). Dans le cas d'utilisation d'une fonctionnalité de connection, vous crypter l'user et comparer les hashs l'user et et celui qui est dans la database. (détails ci-dessous) Je suggère également d'append un critère dynamic comme l'ID user à la hashinput afin que 2 user avec le même mot de passe aurait des hashes différents.

Avec cette stratégie, vous n'avez pas de risc avec userpasswords et par conséquent, si des données sont divulguées, ce ne sera pas un problème pour le moment.

Voici un bref aperçu de l'utilisation des algorithms de hachage

Donc (si la string de sécurisation est donnée) décrypter d' abord le SecureSsortingng

 Ssortingng SecureSsortingngToSsortingng(SecureSsortingng value){ IntPtr valuePtr = IntPtr.Zero; try{ valuePtr = Marshal.SecureSsortingngToGlobalAllocUnicode(value); return Marshal.PtrToSsortingngUni(valuePtr); } finally{ Marshal.ZeroFreeGlobalAllocUnicode(valuePtr); } } 

Que hacher par exemple avec SHA256. De ce post

  using (SHA256 hash = SHA256Managed.Create()) { Encoding enc = Encoding.UTF8; //the user id is the salt. //So 2 users with same password have different hashes. //For example if someone knows his own hash he can't see who has same password ssortingng input = userInput+userId; Byte[] result = hash.ComputeHash(enc.GetBytes(input)); foreach (Byte b in result) Sb.Append(b.ToSsortingng("x2")); //You could also use other encodingslike BASE64 } 

Stockez ce hashsum. En fonction de votre enencoding, cela peut ressembler à ceci:

ac5b208b4d35ec79fa7c14b7a31f9c80392cdab2bc58bc5b79bcfe64b044d899

dans votre database. Si l'user se connecte, créez le hachage à partir de son input et comparez-le avec le hachage de la database. s'ils sont égaux, le mot de passe est correct. Par conséquent, vous n'avez jamais besoin d'avoir le mot de passe de l'user en clair partout stocké.

Si le client fait le hachage alors il devrait absolut ne devrait pas exister comme un text en clair (sauf la textbox si elle ne supporte pas la string de security)

PS: c'est seulement une option. Mais l'essentiel est de ne jamais stocker de passwords en clair n'importe où. Pour mieux ne jamais les connaître et n'ont aucun changement pour les décrypter.

Une autre stratégie consisterait à utiliser des chiffrements asymésortingques comme RSA mais cela peut devenir plus complexe. Si vous avez besoin d'aide avec cela, je reorderais un post dédié à ce sujet.

Selon vos besoins et votre environnement, la plupart des hashsums devraient être une solution acceptable. (Mais ce n'est pas un conseil juridique car je ne suis pas un avocat)