Konvertieren Sie HashBytes in VarChar

127

Ich möchte den MD5-Hash eines Zeichenfolgenwerts in SQL Server 2005 abrufen. Ich mache dies mit dem folgenden Befehl:

SELECT HashBytes('MD5', 'HelloWorld')

Dies gibt jedoch eine VarBinary anstelle eines VarChar-Werts zurück. Wenn ich versuche, 0x68E109F0F40CA72A15E05CC22786F8E6in ein VarChar zu konvertieren, bekomme ich há ðô§*à\Â'†øæstattdessen 68E109F0F40CA72A15E05CC22786F8E6.

Gibt es eine SQL-basierte Lösung?

Ja

GateKiller
quelle

Antworten:

147

Ich habe die Lösung woanders gefunden:

SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)
GateKiller
quelle
19
fn_varbintohexstr ist keine dokumentierte Funktion. Verwenden Sie CONVERT (Char, @ value, 2)
Cheburek
Ich habe mich gerade mit Varbinary beschäftigt, weil ich einen Weg für ein Update in das Lager brauchte. Das hat wie ein Zauber gewirkt! danke ...
Nitefrog
Diese Methode ist sehr langsam, verwendet eine undokumentierte Funktion und funktioniert in Azure nicht. Nicht cool. Verwenden Sie stattdessen Konvertieren!
Rocklan
4
CONVERT () funktioniert in SQL 2005 nicht. Wenn Sie SQL 2008 oder höher verwenden, verwenden Sie CONVERT () nach Belieben. Leider ist mir kein einziger Befehl bekannt, der für alle SQL-Versionen funktioniert. Führen Sie daher entweder eine verrückte Versionsprüfung in Ihrem Skript durch oder notieren Sie sich irgendwo, dass Sie die Funktion reparieren müssen, wenn Sie SQL-Versionen aktualisieren.
Carl Bussema
5
CONVERT (Char, @ value, 2) gibt nur 32 Bytes aus. Wenn Sie dies mit einem sha1-Hash tun, werden Sie ihn abschneiden. Sie müssen convert (char (48), @ value, 2), um die entsprechende Ausgabe beizubehalten.
Andrew Hill
82
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)
Rapscallion
quelle
4
Dies funktioniert in SQL Azure. für SHA1: SELECT CONVERT (VARCHAR (40), HashBytes ('SHA1', 'Hello World'), 2)
Raptor
4
Sie müssen nvarchar nicht unnötig verwenden.
Ian Kemp
3
Die Frage lautet SQL Server 2005, und wenn Sie einen der oben genannten Vorschläge (und wahrscheinlich auch eine andere Version) ausführen, tun sie nicht das, wonach sie gefragt werden. Sie erhalten das Zeichen, dem die Bytes entsprechen, nicht die Bytes als Hex-Zeichenfolge, nach der gefragt wird. GateKiller und Xarqron geben Antworten, die funktionieren.
David Knight
Wo kann ich über diese Konvertierungsstile lesen? 2 in diesem Fall, der als Parameter übergeben wird. Und wie kann man ein Äquivalent dazu in C # -Code erstellen? Welche Kodierung soll ich wählen?
Dmytro Zhluktenko
31

Verwenden Sie master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0)anstelle von master.dbo.fn_varbintohexstrund dann substringingdas Ergebnis.

In der Tat fn_varbintohexstrAnrufe fn_varbintohexsubstringintern. Das erste Argument von fn_varbintohexsubstringsagt, dass es 0xFals Präfix hinzugefügt werden soll oder nicht. fn_varbintohexstrruft fn_varbintohexsubstringmit 1als erstes internes Argument auf.

Weil Sie nicht brauchen 0xF, rufen Sie fn_varbintohexsubstringdirekt an.

Xaqron
quelle
27

Im Gegensatz zu David Knight geben diese beiden Alternativen in MS SQL 2008 dieselbe Antwort zurück:

SELECT CONVERT(VARCHAR(32),HashBytes('MD5', 'Hello World'),2)
SELECT UPPER(master.dbo.fn_varbintohexsubstring(0, HashBytes('MD5', 'Hello World'), 1, 0))

Es sieht also so aus, als wäre der erste ab Version 2008 die bessere Wahl.

Timo Riikonen
quelle
Geben Sie dies nicht versehentlich ein, was eine subtil andere Antwort ergibt! ... convert (varchar, HashBytes ('MD5', 'Hello World')), 2)
andrew pate
13
convert(varchar(34), HASHBYTES('MD5','Hello World'),1)

(1 zum Konvertieren von Hexadezimal in Zeichenfolge)

konvertiere dies in niedriger und entferne 0x vom Anfang des Strings durch Teilzeichenfolge:

substring(lower(convert(varchar(34), HASHBYTES('MD5','Hello World'),1)),3,32)

genau das gleiche wie in C #, nachdem wir Bytes in einen String konvertiert haben

Ramans
quelle
2

Aufgrund meiner persönlichen Erfahrung mit der Verwendung des folgenden Codes in einer gespeicherten Prozedur, in der eine SP-Variable gehasht wurde, kann ich bestätigen, dass diese Kombination, obwohl nicht dokumentiert, gemäß meinem Beispiel zu 100% funktioniert:

@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_512', @SPvar)), 3, 128)
Simon Jones
quelle
-3

Das Ändern des Datentyps in varbinary scheint für mich am besten zu funktionieren.

Anopres
quelle