2010-02-08 3 views
1

J'utilise un membre personnalisé MemberShipProvider dans le projet aC# basé sur le code de: http://www.asp.net/learn/videos/video-189.aspx et pour une raison que je ne peux pas comprendre, la méthode qui décrypte le mot de passe de l'utilisateur pour valider la connexion donne 8 caractères supplémentaires devant la valeur du mot de passe (par exemple: Mot de passe)..NET personnalisé MembershipProvider décrypter mot de passe

J'utilise "crypté" passwordFormat et la méthode UnEncodePassword consiste à:

private string UnEncodePassword(string encodedPassword) 
{ 
    string password = encodedPassword; 
    password = Encoding.Unicode.GetString(DecryptPassword(Convert.FromBase64String(encodedPassword))); 

    return password; 
} 

Merci!

Répondre

2

Trouvé! Je dois soustraire la variable de ma encodedPassword déchiffré sel 16 octets pour obtenir le mot de passe:

private string UnEncodePassword(string encodedPassword) 
{ 
    string password = encodedPassword; 
    byte[] bytesIn = Convert.FromBase64String(encodedPassword); 
    byte[] bytesRet = DecryptPassword(bytesIn); 
    password = System.Text.Encoding.Unicode.GetString(bytesRet, 16, bytesRet.Length - 16); 

    return password; 
} 

Merci Ian pour me donner la moindre idée de sel!

+2

Vous supprimez simplement le mot "䝉  慣 嘗  㳪 畕 锬" de votre chaîne sans vraiment savoir pourquoi. byteRet est votre chaîne décryptée, unicode est de 2 octets par caractère, donc votre dernière ligne dit "convertir les octets en chaîne, en ignorant les 8 derniers caractères" ou y a-t-il une autre raison pour utiliser la valeur de 16? –

6

"Est-ce que le salt? (mis à jour)

Sur le serveur, dans un web.config ou autre vous avez une valeur de sel telle que "milkshake". Lorsque l'utilisateur donne un mot de passe comme "TheYard", vous ajoutez le sel et cryptez "milkshakeTheYard". Quand ils se connectent, vous ajoutez le sel à leur demande et le comparez à la chaîne cryptée.

Alors, quel est le point de sel? Si le mot de passe chiffré est tombé entre de mauvaises mains, "TheYard" étant seulement 7 caractères est facile à rechercher sur un Rainbow Table. En ajoutant du sel, vous rendez ce processus beaucoup plus difficile. Le sel à lui seul fournit peu de sécurité, mais utilisé en combinaison fournit une couche supplémentaire facilement impléméntée.

+0

désolé ... je ne comprends pas? –

+0

Je vois, dans le contexte de ma question, mot de passe est "le mot de passe" et est le mot que j'attends uniquement de la méthode DecryptPassword, d'où mon problème parce que je reçois ces huit caractères cryptiques + clear_password_value. Il doit être quelque chose de stupide car clairement le cryptage/décryptage fonctionne ou je ne serais même pas obtenir le texte clair lors du décryptage autrement. :( –

+0

Désolé mon pote mais je dois rétrograder votre réponse car c'est un commentaire et je veux garder la réponse valide en haut –

4

Vous ne devriez pas pouvoir déchiffrer le mot de passe. Vous devez crypter le mot de passe entré par l'utilisateur et le comparer au mot de passe crypté stocké. La récupération de mot de passe doit générer un mot de passe aléatoire à usage unique et obliger l'utilisateur à le modifier la première fois qu'il est utilisé.

+1

Le DecryptPassword est une méthode dans l'assembly de sécurité .NET, je remplace juste la méthode existante pour le faire fonctionner avec mon appartenance personnalisée. Votre publication doit être un commentaire, pas une réponse. –

+0

Vous avez raison. Mais je pense que si vous pouvez décrypter le mot de passe, vous pouvez aussi bien le stocker en clair. –

+0

Je vois votre point, mais au moins avoir les mots de passe et autres informations sensibles dans un format illisible dans la base de données est assez sécurisé pour passer un audit de sécurité. Le déchiffrement des informations nécessite la clé machine même avec la base de données et le fait de savoir comment fonctionne la méthode DecryptPassword ne suffira pas à compromettre mes données. –

Questions connexes