۱۳۸۸/۰۲/۱۴

مقايسه نتايج الگوريتم‌هاي هش كردن اطلاعات در اس كيوال سرور و دات نت


از اس كيوال سرور 2005 به بعد تابع HashBytes نيز به مجموعه توابع قابل استفاده در دستورات T-SQL اس كيوال سرور اضافه شده است كه الگوريتم‌هاي MD2 | MD4 | MD5 | SHA | SHA1 را پشتيباني مي‌كند. براي مثال:
DECLARE @str1 VARCHAR(4),
@str2 NVARCHAR(4)

--متن يونيكد اينجا ناقص ذخيره مي‌شود
SET @str1 = 'وحيد'

SET @str2 = N'وحيد'

SELECT hashbytes('md5', @str1) --C82A7D721AAE517AD76EF1B871BC33CE

SELECT hashbytes('md5', @str2) --7D883091B80F3CD20B872CADBFDDACDF

اگر اين نتايج را بخواهيم با استفاده از فضاي نام استاندارد System.Security.Cryptography توليد كنيم، بايد به encoding رشته دريافتي حتما دقت داشت؛ در غير اينصورت نتايج يكسان نخواهند بود.
مهم‌ترين encoding هاي پشتيباني شده در دات نت در جدول زير برشمرده شده‌اند:

Encoding تعداد بيت هر كاراكتر

ASCII
هر كاراكتر آن 7 بيت است

UTF7
هر كاراكتر آن 7 بيت است

UTF8
هر كاراكتر آن 8 بيت و يا يك بايت است

Unicode (UTF-16)
هر كاراكتر آن 16 بيت و يا دو بايت است

UTF32
هر كاراكتر آن 32 بيت و يا 4 بايت است


نوع nvarchar در اس كيوال سرور همانند حالت Encoding.Unicode‌ دات نت است و هر كاراكتر آن 2 بايت مي‌باشد.
اين نكته‌ هنگام استفاده از اين توابع بسيار حائز اهميت است. براي مثال اگر تابع HashBytes اس كيوال سرور را بخواهيم در دات نت پياده سازي كنيم، به كلاس زير خواهيم رسيد:

using System.Text;
using System.Security.Cryptography;

class CHash
{
public static string GetMD5Hash(string input, Encoding encoding)
{
byte[] bytes = new MD5CryptoServiceProvider().ComputeHash(encoding.GetBytes(input));
StringBuilder chars = new StringBuilder();
foreach (byte chr in bytes)
{
chars.Append(chr.ToString("x2"));
}
return chars.ToString();
}
}
در اينجا تنها حالت زير با هش توليد شده يك فيلد يا متغير از نوع nvarchar توسط تابع HashBytes اس كيوال سرور معادل است:

string result = CHash.GetMD5Hash("وحيد", Encoding.Unicode);

پ.ن.
احتمالا عده‌اي را ديده‌ايد كه هر چقدر تلاش مي‌كنند با سي شارپ متون ايران سيستم تحت داس را به نمونه‌هاي ويندوزي تبديل كنند، كمتر موفق مي‌شوند؛ علت را با توجه به جدول encoding فوق و عدم اطلاع از آن بهتر مي‌توان بررسي كرد.