2009-02-09 6 views
1

Mon utilisateur a un champ de mot de passe tel que "0! ZWQ2" enregistré dans la base de données. Je dois déchiffrer mon mot de passe d'entrée Utilisateur de "aA1234" à "0! ZWQ2" et le comparer aux données dans une base de données. !Comment remplacer une valeur par une autre lors de la comparaison de 2 chaînes?

Les 2 chaînes que je comparée_à représente:

« abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 » Avec « 9setybcpqwiuvxr108daj5'-` ~ @ # $%^& *() _ + |}] [{:.?/< > @ # ZWQ2 ,; 34 kDa »

de cette façon, a = 9 et 0 = a

Comment puis-je faire cela en C#, des idées?

J'ai juste besoin de prendre le champ de mot de passe de l'entrée d'utilisateur et brouiller le texte drôle pour le comparer aux données dans la base de données.

Toute aide sera appréciée.

Cordialement Etienne

Mises à jour: (10 février 2009) Merci à tous pour les réponses. S'il vous plaît noter que je me rends compte qu'il existe de bien meilleures façons de gérer cela. Mais s'il vous plaît noter que je crée une application ASP.NET qui est assis à l'intérieur de SharePoint se connecter à des données de fichier plat Cobol et non une base de données appropriée. Utilisation de Transoft pour connecter mon ASP.NET (connecteur ODBC) aux fichiers plats Cobol. Donc, je dois rester avec ce code, et cela ne sera pas utilisé sur mon site privé. Je n'ai également aucun contrôle sur quand le mot de passe est créé dans Cobol.

+0

Je viens de répondre à votre demande exacte. C'est ok si vous utilisez ceci juste pour apprendre ou quelque chose. Mais s'il vous plaît soyez prudent, ne pas utiliser ce genre de brouillage sur le projet réel. Vous pouvez obtenir de nombreuses techniques de cryptage intégrées dans .net pour ce type de travail. Bonne chance :) –

Répondre

5

Voici un exemple de code rapide, rapide et de moindre importance à convertir.

code en C#:

 char[] OriginalChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".ToCharArray(); 
     char[] ScrambleChars = "9setybcpqwiuvxr108daj5'-`[email protected]#$%^&()+|}][{:.?/<>,;[email protected]#34KDART".ToCharArray(); 
     string TextToTransfer = "Hello"; 
     string NewText = ""; 
     foreach (char c in TextToTransfer) 
     { 
      NewText = NewText + ScrambleChars[Array.IndexOf<char>(OriginalChars, c)].ToString(); 
     } 
     Console.WriteLine(NewText); 

code en VB:

Dim OriginalChars() As Char = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" 
    Dim ScrambleChars() As Char = "9setybcpqwiuvxr108daj5'-`[email protected]#$%^&()+|}][{:.?/<>,;[email protected]#34KDART" 
    Dim TextToTransfer As String = "Hello" 
    Dim NewText As String = "" 
    For Each c As Char In TextToTransfer 
     NewText += ScrambleChars(Array.IndexOf(OriginalChars, c)) 
    Next 
    MsgBox(NewText) 
+0

De bonnes choses !!! Merci beaucoup!!!!!! – Etienne

+0

devrait peut-être utiliser un stringbuilder dans cette boucle? – Svish

5

Une raison spéciale de ne pas utiliser un hachage standard + sel pour stocker les mots de passe, au lieu d'un chiffrement Caesars?

Une façon qui devrait le résoudre (code non testé):

new string("aA1234".ToCharArray().Select(c => ScrambleChars[OriginalChars.IndexOf(c)]).ToArray()); 
+0

+1 - c'est la sécurité par l'obscurité. J'espère que je n'utilise pas ce site ... –

+0

Utilisation de fichiers plats Cobol avec ASP.net – Etienne

+0

Il a déclaré qu'il compare les mots de passe à un dans une base de données, je suis sûr que la question serait axée sur le cryptage du mot de passe pour le stockage si c'était quelque chose qu'il contrôlait. –

0

J'écrire un utilitaire de classe qui contient un Encode ou Traduisez méthode qui prend la inputString et (chèques pour toute mauvaise/entrée malicieuse) le transfigure en utilisant votre méthode de chiffrement.

return String.Compare(dbPassword, PasswordUtility.Encode(inputString)); 
2

Vous ne devriez pas enregistrer les mots de passe dans votre base de données d'une manière qui peut être inversée. L'administrateur de la base de données ou un pirate intrusion dans votre système ne devrait pas être en mesure d'obtenir les mots de passe stockés par l'utilisateur.

1

Tout d'abord, que d'autres utilisateurs ont déclaré, si vous la conception de ce système et un procédé de stockage de mot de passe, cette méthode est presque sans valeur et il y a beaucoup plus de méthodes sécurisées qui devraient être utilisées à la place.

Cependant, le fait que vous demandiez de faire cette comparaison me fait penser que vous n'avez aucun contrôle sur ce qui est déjà dans la base de données et que vous travaillez avec quelque chose de plus ancien.

La fonction ci-dessous prendra le mot de passe de votre utilisateur sous forme de chaîne et retournera le mot de passe de la base de données sous forme de chaîne. Une chose à noter, les deux chaînes que vous avez fournies ne sont pas de longueur égale et donc tomberaient en panne pour les caractères 9 et 0. J'ai ajouté des lettres supplémentaires B et C à la chaîne dbChars. En outre, j'ai "supposé" que tous les caractères entrés qui ne peuvent pas être trouvés dans les caractères de mappage sont simplement ajoutés comme saisis. Vous pouvez exiger que ces caractères soient ignorés.

private string DatabasePassword(string userPassword) 
    { 
     //Constants showing mapping between user password and database password 
     const string userChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; 
     const string dbChars = "9setybcpqwiuvxr108daj5'-`[email protected]#$%^&()+|}][{:.?/<>,;[email protected]#34KDABC"; 

     //Stringbuilder used to build the database password for output 
     System.Text.StringBuilder databasePassword = new System.Text.StringBuilder(); 

     //Run through every character in the user password 
     foreach (Char userChar in userPassword) 
     { 
      //Find the index of the user character in the userChars string. 
      int userCharIndex = userChars.IndexOf(userChar); 

      //if the userChar exists in the userChars string then map the character to the 
      //equivalent database pasword character else just use the entered char 
      char mappedChar = userCharIndex >= 0 ? dbChars[userChars.IndexOf(userChar)] : userChar; 

      //Append mapped password to the output database password 
      databasePassword.Append(mappedChar); 
     } 

     return databasePassword.ToString(); 
    } 
Questions connexes