md5 i t-sql

Aby wyliczyć hash md5 w sql server korzystając z t-sql, powinniśmy zdefiniować prostą funkcję która nam to ułatwi. Jako że w większości przypadków posługujemy się hashem zapisanym jako 32 znaki w zapisie 16stkowym.

create FUNCTION genmd5
(
@inputstring varchar(max)
)
RETURNS varchar(32)
AS
BEGIN

return LOWER(CONVERT(VARCHAR(32), HashBytes('MD5', CONVERT(varchar, @inputstring )), 2))

END
GO

To co jest istotne w tej funkcji to linia:
return LOWER(CONVERT(VARCHAR(32), HashBytes('MD5', CONVERT(varchar, @inputstring )), 2))

wygląda ona dość skomplikowanie ze względu na konwersje. Należy się upewnić że ciąg wejściowy to varchar inaczej funkcja HashBytes może zwrócić inne wyniki (hashowanie odbywa się na poziomie bajtów a różne typy danych mogą mieć różne zapisy).
Jako że podobnie jak w .NET wynik ejst zwracany jako zapis bajtów należy go również zamienić na napis w odpowiedni sposób. Przyjęło się że hashe są przekazywane małymi literami.

md5 i .net (C#)

Czasem zachodzi potrzeba wygenerowania hasha MD5, aby tego dokonać w środowisku .NET potrzebujemy napisać prostą metodę:


public static string genMD5(string input)
{
System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
byte[] hashBytes = md5.ComputeHash(inputBytes);

StringBuilder sb = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++) { sb.Append(hashBytes[i].ToString("X2")); } return sb.ToString().ToLower(); }

tłumacząc kod od góry jest to publiczna metoda statyczna (można jej użyć bez instancjonowania klasy). Jako argument przyjmuje ona string który chcemy zakodować.

System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
Tworzy nam obiekt md5, który odpowiada za generowanie hashy (skrótów).

System.Security.Cryptography
jest namespacem, którego użyłem by nie było problemu z usingami, można też to dodać na samej górze i wtedy stworzenie obiektu będzie wyglądało tak:

MD5 md5 = MD5.Create();

byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
Zamienia nasz napis na tablicę bajtów, które zostaną użyte to skalkulowania hasha.

byte[] hashBytes = md5.ComputeHash(inputBytes);
Powyższa linia tworzy tablicę bajtów w której znajduje się 16 elementów (Md5 zwraca hashe o długości 128bitów).


StringBuilder sb = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++) { sb.Append(hashBytes[i].ToString("X2")); }

Na koniec możemy zamienić nasz hash na napis zawierający 32znaki (liczba w zapisie 16stkowym).