2009-10-19 6 views
1

Dans une application WinForm utilisant C# .NET 2.0 (sur Vista), j'utilise le hachage SHA1 pour créer un hachage à partir d'une chaîne et stocker le hachage dans un fichier texte (avec codage UTF-8)). Je veux utiliser le hash stocké dans le fichier texte dans un état. Lorsque je lance le projet sous Vista, cela fonctionne correctement (c'est-à-dire que la condition est vraie), mais quand je cours sous XP, le projet ne fonctionne pas.SHA1 hash différent sous Vista et XP

Est-ce que le hash créé sous Vista est différent de XP?

code extrait

byte[] HashValue; 
byte[] MessageBytes = Encoding.UTF8.GetBytes(strPlain); 
SHA1Managed SHhash = new SHA1Managed(); 
StringBuilder strHex = new StringBuilder(""); 
HashValue = SHhash.ComputeHash(MessageBytes); 
foreach (byte b in HashValue) 
{ 
    strHex.AppendFormat("{0:x2}", b); 
} 
// storing strHex in a text file with UTF-8 encoding 

test état

string newHash = Program.GetHash("This will be hashed."); 
// GetHash() does has the same code as above, but instead of storing hash in file in return 
// hash. 
bool validHash = newHash.Equals(oldHash); 
// old has is the one stored in file 
if (validHash) 
{ 
    // some code 
} 

[Modifier]

Le principal problème est le même code fonctionne très bien dans Vista, mais tombe en panne dans XP. S'il y a un problème logique il ne devrait pas fonctionner dans n'importe quel système d'exploitation.

Merci.

+0

Pouvez-vous poster le code que vous utilisez? –

+0

Pouvez-vous également publier le code qui implémente la "condition" à laquelle vous faites référence dans votre question? Aussi, avez-vous vérifié que 'MessageBytes' est le même pour la même valeur d'entrée' strPlain' sur chaque plate-forme? –

+0

Merci. Oui, la valeur strPlain est la même. J'utilise une phrase simple "Cela va être haché". Regards – kobra

Répondre

1

Comment passez-vous les binaires entre les machines? Une fois, j'ai rencontré un problème de validation de hachage lorsque j'ai compressé les binaires avec le mode de compression maximum 7zip et que je l'ai décompressé avec winzip de l'autre côté, lorsque je préparais un paquet ClickOnce sur ma machine.

+0

Merci. Je suis le courrier électronique les binaires en format compressé (zip). – kobra

0

Je suis curieux de savoir pourquoi vous avez mentionné le codage UTF-8 en ce qui concerne le stockage de la valeur de hachage dans un fichier texte. Essayez-vous de stocker les octets de données brutes, en quelque sorte convertis en UTF-8, ou stockez-vous une représentation hexadécimale de la valeur de hachage?

Normalement, lorsque le stockage d'une valeur de hachage dans un fichier texte, vous devez utiliser la représentation hexagonale, tels que:

3e2f9d9069abd6ace2cb18f7390a06c034a0f9dd 

Il n'y aurait pas besoin d'utiliser spécifiquement encodage UTF-8, car ce qui précède est clair ASCII ordinaire.

+0

Merci. J'utilise une représentation hexadécimale comme indiqué ci-dessus. Est-ce que UTF-8 cause le problème? Observe – kobra

+0

Il est peu probable que UTF-8 cause votre problème. Pouvez-vous poster le code que vous utilisez? –

0

Je suppose que l'ancien hachage stocké dans le fichier peut être incorrect. Essayez un extrait d'application de console simple sur chaque machine. Quelque chose comme:

Console.WriteLine(Program.GetHash("This will be hashed.")); 

Si ceux-ci sont en effet donnent le même résultat, alors il doit être quelque chose à voir avec la routine de comparaison (à savoir oldHash probablement mentionné ci-dessus).

Une autre chose à noter; Je vois que vous utilisez bool validHash pour stocker les résultats de la comparaison, mais en vérifiant la valeur booléenne validSource par la suite. Est-ce juste un faux-nom?

+0

Merci d'indiquer validSource. Je l'ai corrigé. C'était juste un faute de frappe. Cordialement – kobra

+0

Salut. Console.WriteLine(Program.GetHash("This will be hashed.")); donne un résultat différent dans XP et Vista. Aucune idée de pourquoi le code est identique dans les deux cas. – kobra

Questions connexes