38 votes

C# SHA-1 vs PHP SHA-1...à des Résultats Différents?

Je suis en train de calculer un Hash SHA-1 à partir d'une chaîne, mais quand je calcule la chaîne à l'aide de php de la fonction sha1-je obtenir quelque chose de différent que quand je l'ai essayer en C#. J'ai besoin de C# pour calculer la même chaîne que le PHP (depuis la chaîne de php est calculée par une 3ème partie que je ne peux pas modifier). Comment puis-je obtenir C# pour générer le même hash que le PHP? Merci!!!

String = s934kladfklada@a.com

Code C# (Génère d32954053ee93985f5c3ca2583145668bb7ade86)

        string encode = secretkey + email;
        UnicodeEncoding UE = new UnicodeEncoding();
        byte[] HashValue, MessageBytes = UE.GetBytes(encode);
        SHA1Managed SHhash = new SHA1Managed();
        string strHex = "";

        HashValue = SHhash.ComputeHash(MessageBytes);
        foreach(byte b in HashValue) {
            strHex += String.Format("{0:x2}", b);
        }

Le Code PHP (Génère a9410edeaf75222d7b576c1b23ca0a9af0dffa98)

sha1();

39voto

Andrew Moore Points 49765

Utilisation ASCIIEncoding au lieu de UnicodeEncoding. PHP utilise le jeu de caractères ASCII pour les calculs de hachage.

8voto

OmarElsherif Points 89

Cette méthode à .NET est équivalent à sha1 en php:

string sha1Hash(string password)
{
    return string.Join("", SHA1CryptoServiceProvider.Create().ComputeHash(Encoding.UTF8.GetBytes(password)).Select(x => x.ToString("x2")));
}

6voto

Paul Johnson Points 734

J'ai eu ce problème aussi. Le code suivant fonctionne.

string dataString = "string to hash";
SHA1 hash = SHA1CryptoServiceProvider.Create();
byte[] plainTextBytes = Encoding.ASCII.GetBytes(dataString);
byte[] hashBytes = hash.ComputeHash(plainTextBytes);
string localChecksum = BitConverter.ToString(hashBytes)
.Replace("-", "").ToLowerInvariant();

2voto

zwanz0r Points 563

Eu le même problème. Ce code a fonctionné pour moi:

string encode = secretkey + email;
SHA1 sha1 = SHA1CryptoServiceProvider.Create();
byte[] encodeBytes = Encoding.ASCII.GetBytes(encode);
byte[] encodeHashedBytes = sha1.ComputeHash(passwordBytes);
string pencodeHashed = BitConverter.
ToString(encode HashedBytes).Replace("-", "").ToLowerInvariant();

1voto

FWIW, j'ai eu un problème similaire en Java. Il s'est avéré que j'ai eu à utiliser "UTF-8" de codage pour produire la même SHA1 hachages en Java, comme l' sha1 fonction produit en PHP 5.3.1 (en cours d'exécution sur XAMPP Vista).

    private static String SHA1(final String text) throws NoSuchAlgorithmException, UnsupportedEncodingException {
        final MessageDigest md = MessageDigest.getInstance("SHA-1");
        md.update(text.getBytes("UTF-8"));
        return new String(org.apache.commons.codec.binary.Hex.encodeHex(md.digest()));
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X