it-swarm.com.de

Mit Sha256 einen String hacken

Ich versuche, eine Zeichenfolge mit SHA256 zu hashen. Ich verwende den folgenden Code:

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;
    }
}

Allerdings gibt dieser Code deutlich andere Ergebnisse als meine Freunde PHP sowie Online-Generatoren (wie Dieser Generator )

Weiß jemand was der Fehler ist? Unterschiedliche Basen?

133
Nattfrosten

Encoding.Unicode Ist der irreführende Name von Microsoft für UTF-16 (eine doppelte Codierung, die in der Windows-Welt aus historischen Gründen verwendet wird, aber von niemand anderem verwendet wird). http://msdn.Microsoft.com/en-us/library/system.text.encoding.unicode.aspx

Wenn Sie Ihr Array bytes untersuchen, sehen Sie, dass jedes zweite Byte 0x00 Ist (aufgrund der doppelten Codierung).

Sie sollten stattdessen Encoding.UTF8.GetBytes Verwenden.

Es werden jedoch auch unterschiedliche Ergebnisse angezeigt, je nachdem, ob Sie das abschließende '\0' - Byte als Teil der von Ihnen gehashten Daten betrachten oder nicht. Das Hashing der beiden Bytes "Hi" Ergibt ein anderes Ergebnis als das Hashing der drei Bytes "Hi". Sie müssen sich entscheiden, was Sie tun möchten. (Vermutlich möchten Sie tun, was auch immer der PHP Code Ihres Freundes tut.)

Für ASCII Text ist Encoding.UTF8 Definitiv geeignet. Wenn Sie eine perfekte Kompatibilität mit dem Code Ihres Freundes anstreben, auch bei Nicht-ASCII-Eingaben, sollten Sie einige Testfälle mit Nicht-ASCII-Eingaben ausprobieren. ASCII-Zeichen wie é Und Und prüfen Sie, ob Ihre Ergebnisse noch übereinstimmen. Wenn nicht, müssen Sie herausfinden, welche Codierung Ihr Freund tatsächlich verwendet. Es könnte sich um eine der 8-Bit-Codepages handeln, die vor der Erfindung von Unicode populär waren. (Auch hier denke ich, dass Windows der Hauptgrund ist, warum sich immer noch jemand Gedanken über "Codeseiten" machen muss.)

148
Quuxplusone

Ich hatte auch dieses Problem mit einem anderen Implementierungsstil, aber ich habe vergessen, wo ich es bekommen habe, seit es vor 2 Jahren war.

static string sha256(string randomString)
{
    var crypt = new SHA256Managed();
    string hash = String.Empty;
    byte[] crypto = crypt.ComputeHash(Encoding.ASCII.GetBytes(randomString));
    foreach (byte theByte in crypto)
    {
        hash += theByte.ToString("x2");
    }
    return hash;
}

Wenn ich etwas eingebe wie abcdefghi2013 aus irgendeinem Grund gibt es unterschiedliche Ergebnisse und führt zu Fehlern in meinem Login-Modul. Dann habe ich versucht, den Code wie von Quuxplusone vorgeschlagen zu ändern und die Codierung von ASCII in UTF8 dann hat es endlich geklappt!

static string sha256(string randomString)
{
    var crypt = new System.Security.Cryptography.SHA256Managed();
    var hash = new System.Text.StringBuilder();
    byte[] crypto = crypt.ComputeHash(Encoding.UTF8.GetBytes(randomString));
    foreach (byte theByte in crypto)
    {
        hash.Append(theByte.ToString("x2"));
    }
    return hash.ToString();
}

Nochmals vielen Dank an Quuxplusone für die wunderbare und ausführliche Antwort!)

96
Nico Dumdum

In der PHP Version können Sie im letzten Parameter 'true' senden, aber der Standardwert ist 'false'. Der folgende Algorithmus entspricht der standardmäßigen PHP-Hash-Funktion, wenn 'sha256' als '' übergeben wird erster Parameter:

public static string GetSha256FromString(string strData)
    {
        var message = Encoding.ASCII.GetBytes(strData);
        SHA256Managed hashString = new SHA256Managed();
        string hex = "";

        var hashValue = hashString.ComputeHash(message);
        foreach (byte x in hashValue)
        {
            hex += String.Format("{0:x2}", x);
        }
        return hex;
    }
4
Rachel