2009-07-09 9 views
4

Dans des langages comme PHP ou Python, il existe des fonctions pratiques pour transformer une chaîne d'entrée en une chaîne de sortie qui est la représentation HEXed de celle-ci. Je trouve que c'est une tâche très courante et utile (stockage et vérification de mot de passe, somme de contrôle du contenu du fichier ..), mais dans .NET, autant que je sache, vous ne pouvez travailler que sur les flux d'octets. Une fonction pour faire le travail est facile à mettre (par exemple http://blog.stevex.net/index.php/c-code-snippet-creating-an-md5-hash-string/), mais j'aimerais savoir si quelque chose me manque, si j'utilise un mauvais modèle ou s'il n'y a tout simplement rien de tel dans .NET.C#: String -> MD5 -> Hex

Merci

+2

Envisagez d'utiliser SHA-256 au lieu de MD5. – inazaruk

Répondre

7

La méthode lié à semble droite, une méthode légèrement différente est montré sur la MSDN C# FAQ

Un commentaire vous suggère que vous pouvez utiliser:

System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(string, "MD5"); 
+1

Mais s'il vous plaît * ne pas * utiliser le code indiqué dans la FAQ, car il utilise Encoding.ASCII et traitera donc tous les caractères non-ASCII comme "?" - ce qui en fait un hachage assez horrible. –

5

Oui, vous ne pouvez travailler avec des octets (pour autant que je sache). Mais vous pouvez transformer ces octets facilement dans leur représentation hexagonale en boucle à travers eux et de faire quelque chose comme:

myByte.ToString("x2"); 

Et vous pouvez obtenir les octets qui composent la chaîne en utilisant:

System.Text.Encoding.UTF8.GetBytes(myString); 

Il pourrait être fait en quelques lignes.

5

Un problème est avec le concept même de « l'ensorcelé représentation de [une chaîne] ".

Une chaîne est une séquence de caractères. La façon dont ces caractères sont représentés en tant que bits individuels dépend de l'encodage. L'encodage "natif" vers .NET est UTF-16, mais généralement une représentation plus compacte est obtenue (tout en préservant la possibilité d'encoder n'importe quelle chaîne) en utilisant UTF-8.

Vous pouvez utiliser Encoding.GetBytes pour obtenir la version codée d'une chaîne une fois que vous avez choisi un codage approprié - mais le fait qu'il y est ce choix à faire est la raison pour laquelle il n'y a pas beaucoup d'API qui vont directement de chaîne à base64/hex ou qui effectuent le cryptage/hachage directement sur les chaînes. Toutes ces API qui existent vont presque certainement faire le "codage d'un tableau d'octets, effectuer un fonctionnement binaire approprié, décoder des données binaires opaques en hex/base64". Cela me fait me demander s'il ne vaudrait pas la peine d'écrire une classe utilitaire qui pourrait prendre un codage, un Func<byte[], byte[]> et un format de sortie tel que hex/base64 - qui pourrait représenter une opération binaire arbitraire appliquée à une chaîne.

Questions connexes