Le hachage d'un string avec Sha256
J'essaie de hash d'une chaîne à l'aide de SHA256, je suis en utilisant le code suivant:
using System;
using System.Security.Cryptography;
using System.Text;
public class Hash
{
public static string getHashSha256(string text)
{
byte[] bytes = Encoding.Unicode.GetBytes(text);
SHA256Managed hashstring = new SHA256Managed();
byte[] hash = hashstring.ComputeHash(bytes);
string hashString = string.Empty;
foreach (byte x in hash)
{
hashString += String.Format("{0:x2}", x);
}
return hashString;
}
}
Toutefois, ce code donne des résultats sensiblement différents par rapport à mes amis de php, ainsi qu'en ligne des générateurs (comme Ce générateur)
Personne ne sait quelle est l'erreur? Bases différentes?
- Hors sujet, mais gardez à l'esprit que la création d'un StringBuilder et à l'aide de AppendFormat au lieu de String.Format dans votre boucle foreach empêchera votre code d'inutilement création d'un grand nombre d'objets string.
Vous devez vous connecter pour publier un commentaire.
Encoding.Unicode
Microsoft, qui est le nom trompeur pour UTF-16 (une double échelle de l'encodage, utilisé dans le monde de Windows pour des raisons historiques, mais pas utilisé par quelqu'un d'autre). http://msdn.microsoft.com/en-us/library/system.text.encoding.unicode.aspxSi vous inspectez votre
bytes
tableau, vous verrez que chaque deuxième octet est0x00
(en raison de la double échelle de l'encodage).Vous devriez être en utilisant
Encoding.UTF8.GetBytes
à la place.Mais aussi, vous verrez des résultats différents selon que vous considérez ou non la résiliation de
'\0'
octets à une partie des données, vous êtes de hachage. Le hachage les deux octets"Hi"
donnera un résultat différent de hachage de l' trois octets"Hi"
. Vous aurez à décider qui vous voulez faire. (Je présume que vous voulez faire, celui de votre ami code PHP est en train de faire.)De texte ASCII,
Encoding.UTF8
sera certainement approprié. Si vous visez pour parfait la compatibilité avec votre ami code, même sur la non-ASCII entrées, vous feriez mieux d'essayer quelques-uns des cas de test avec des caractères non-ASCII commeé
et家
et de voir si vos résultats toujours à la hauteur. Si non, vous aurez à comprendre ce que le codage de votre ami est vraiment à l'aide; il pourrait être l'un de la 8-bits de code "pages" que l'habitude d'être populaire avant l'invention de l'Unicode. (Encore une fois, je pense que Windows est la principale raison pour laquelle quelqu'un a encore besoin de s'inquiéter à propos de "pages de code".)short
s", mais pas "tri par UTF16-octets codés" sauf si vous êtes sur un big-endian système de Windows qui ne l'est pas.) Cependant, "tri" dans Unicode est vraiment un sujet complexe, qui doit être enregistré pour un autre jour.J'ai aussi eu ce problème avec un autre style de mise en œuvre, mais j'ai oublié où je l'ai depuis qu'il a été il y a 2 ans.
Quand je saisie quelque chose comme
abcdefghi2013
pour une raison quelconque, il donne des résultats différents et les résultats dans les erreurs dans mon module de connexion.Ensuite, j'ai essayé de modifier le code de la même manière que suggéré par Quuxplusone et changé l'encodage de
ASCII
àUTF8
puis elle a finalement travaillé!Merci encore Quuxplusone pour le merveilleux et la réponse détaillée! 🙂
hash += bit.ToString("x2");
j'ai une question ici: j'ai été en utilisantConvert.ToBase64String(byte[] encryptedBytes)
à reconvertir d'octets de la chaîne. que me donnait des résultats différents. alors, quelle est la différence entre ces deux méthodes de conversion d'octets de la chaîne..?Dans la version de PHP, vous pouvez envoyer 'true' dans le dernier paramètre, mais la valeur par défaut est "false". L'algorithme suivant est équivalent à la valeur par défaut de PHP de la fonction de hachage lors du passage 'sha256' comme premier paramètre:
ASCII
et nebyte[] arrBytes = System.Text.Encoding.UTF8.GetBytes(strData)
à la place.