Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Match a hash created in C# with sql

Tags:

c#

sql

hash

I have a method used to generate a hash:

public static string GetMD5Hash(string input)
    {
        System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
        byte[] bs = System.Text.Encoding.UTF8.GetBytes(input);

        bs = x.ComputeHash(bs);

        System.Text.StringBuilder s = new System.Text.StringBuilder();

        foreach (byte b in bs)
        {
            s.Append(b.ToString("x2").ToLower());
        }
        return s.ToString();
    }

I then save that hash in a varchar(255) column. Knowing what the original input string was, would it be possible to to arrive at the same hash value stored in the varchar(255) column, using sql (2005)??

I have tried like crazy using different data types, conversions and the hashbytes() function, but have not been able to get close.

Example of my failed attempt :(

select convert(varchar, hashbytes('MD5', convert(varbinary(200), '<censored>',0)))
like image 487
Craigt Avatar asked Jun 28 '11 13:06

Craigt


People also ask

What is a hash in C?

A Hash Table in C/C++ (Associative array) is a data structure that maps keys to values. This uses a hash function to compute indexes for a key. Based on the Hash Table index, we can store the value at the appropriate location.

Does C have a Hashmap?

A fast hash map/hash table (whatever you want to call it) for the C programming language. It can associate a key with a pointer or integer value in O(1) time.

Does C have a built in HashTable?

There is no hashtable in the standard C library because either: no-one has submitted a proposal to the working group; or. the working group has deemed it unnecessary.


2 Answers

from #c with "bleepbloop" : 04d3f95947702213e23730a0e8fac6c3

Then

select convert(varchar(32), hashbytes('MD5', 'bleepbloop'), 2)

>> 04D3F95947702213E23730A0E8FAC6C3

Or You could just store & compare as binary.

like image 111
Alex K. Avatar answered Sep 21 '22 05:09

Alex K.


The problem here is that x2 is getting the hex encoding of the data, where-as convert is getting your server's configured decoding of the bytes (which isn't really valid, since that data is not text-based). Very different things. If you keep as varbinary and compare to a byte[] you should be fine.

If you are using SQL Server 2008, you can also use:

select convert(varchar(32), hashbytes('MD5', convert(varbinary(200),
           '<censored>',0)), 2)

to get the hex-encoded version (you can use 1 instead of 2 to get a leading 0x)

like image 21
Marc Gravell Avatar answered Sep 22 '22 05:09

Marc Gravell