زنجیره درهمسازی

**زنجیره درهمسازی** یا **زنجیره هش** اعمال پیوسته تابع درهمساز رمزنگارانه بر روی تعدادی داده‌است. در امنیت رایانه از زنجیره درهمسازی برای بدست آوردن تعداد زیادی رمز یکبار مصرف از روی یک رمز استفاده می‌شود. برای برقراری شرط غیرقابل انکار بودن یک تابع درهمسازی (هش) می‌تواند به بخش‌های مختلف اطلاعات اعمال گردد تا تاریخچه‌ای از داده‌ها و اطلاعات در دسترس باشد.

## تعریف
**زنجیره درهمسازی** اعمال تابع درهمساز رمزنگارانه به‌طور پیوسته بر روی مقداری از داده و اطلاعات است. اگر تابع درهمساز را hدرنظر بگیریم و xیک رشته باشد زنجیره درهمسازی از درجه kبه صورت زیر تعریف می‌شود:h(h(...h(x)...))که معمولاً زنجیرهٔ بالا را به صورت h^k(x)نشان می‌دهند.

## کاربردها
برای اولین بار لیزلی لمپورت  (به انگلیسی: Leslie Lamport) پیشنهاد داد که از زنجیره درهمسازی برای محافظت از رمزعبور در محیط‌های ناامن استفاده شود. به عنوان مثال یک سرور که مجهز به سیستم احراز هویت است می‌تواند از زنجیره درهمسازی به جای نوشته ساده استفاده کند تا از سرقت از سرور جلوگیری شود. با توجه به این که تابع درهمسازی مشخص نیست پس در نتیجه سرقت از سرور مشکل خواهد شد. به عنوان مثال، سرور از کاربر passwordرا دریافت می‌کند و h^{1000}(\mathrm{password})را در ابتدا محاسبه می‌کند و برای احراز هویت مقدار h^{999}(\mathrm{password})از کاربر خواسته می‌شود و سرور با محاسبهٔ h(h^{999}(\mathrm{password}))برابری آن با h^{1000}(\mathrm{password})را چک می‌کند و در صورت صحیح بودن؛ برای احراز هویت بعدی همین کار را با h^{999}(\mathrm{password})انجام می‌دهد. در نتیجه برای دفعهٔ بعد سرور به جای h^{999}(\mathrm{password})انتظار h^{998}(\mathrm{password})را دارد. یعنی در هر مرتبه رمزعبور تغییر می‌کند و این باعث افزایش امنیت اطلاعات سرور خواهد شد. همچنین خاصیت یکطرفه بودن تابع در تابع درهمساز رمزنگارانه امکان محاسبه معکوس تابع را از سارق می‌گیرد. با توجه به این که رمزعبور در هر مرتبه تغییر می‌کند در نتیجه سارق نمی‌تواند به رمزعبور دسترسی پیدا کند. یک نمونه از کد این فرایند به عنوان نمونه به صورت زیر می‌باشد:
```python3
# Server owner knows numbers in Hash Chain and server backward checks the password.

class Server:

    __init__(self, server_pasword, server_owner_name):
        self.server_pasword = server_pasword
        self.server_owner_name = server_owner_name

    login(self, password):
        if (H(password) == self.server_pasword):
            self.server_pasword = password
            login_accepted()
        else:
            print("Uncorrect password")
```


## درخت دودویی درهمسازی
درخت دودویی در همسازی که به آن درخت درهمسازی نیز گفته می‌شود برای محاسبه درهمسازی تعدادی ورودی استفاده می‌شود که مقدار هر راس حاصل درهمسازی ترکیب دو فرزند راس است. به همین ترتیب از برگ‌های درخت شروع به محاسبه درهمسازی می‌کنیم تا درنهایت مقدار ریشه محسابه شود؛ که در شکل زیر یک نمونه از درخت درهمسازی با چهار برگ به عنوان ورودی به نمایش گذاشته شده‌است.
بندانگشتی|درخت دودویی درهمسازی با چهار ورودی
یک مسیر در درخت بالا به رشته‌ای از ۰ و ۱ مشخص می‌شود که ۱ به معنای راست (Right) و ۰ به معنای چپ (Left) است. برای مثال مسیر گذرنده از h_3و h_{34}و h_{root}به صورت کد 10 (RL)تعبیر می‌شود چون h_3ابتدا باید با راس سمت راستش و سپس باید با راس سمت چپش ادغام شود تا h_{root}ساخته شود.

## زنجیره درهمسازی و [[زنجیره بلوکی]]
زنجیره درهمسازی و زنجیره بلوکی هر دو از تابع‌های درهمسازی رمزنگارانه برای ارتباط بین دو ریشه استفاده می‌کنند. تفاوت این دو زنجیره در این است که زنجیره بلوکی (که برای بیت کوین و … استفاده می‌شود) استفاده‌ای همچون دخیره اطلاعات در یک بلوک برای رمزنگاری دارد. به همین دلیل زنجیره بلوکی در ارزهای دیجیتال استفاده فراوان دارد به این صورت که هر بلوک اطلاعات دارای کدی است که در صورت دستیابی به آن کد، بلوک رمزگشایی خواهد شد. کد ذکر شده باید به صورتی باشد که نتیجه درهمسازی آن خاصیت مشخصی داشته باشد. محاسبه کد یک بلوک زمان‌بر و انرژی‌بر است و به همین دلیل است که ارزهای دیجیتال گران محسوب می‌شوند. در طرف دیگر زنجیره درهمسازی استفاده گسترده‌ای در رمزهای یکبار مصرف دارد که امنیت بیشتری نسبت به رمزهای معمولی به ارمغان می‌آورد.

## جستارهای وابسته
* رمز یکبار مصرف

تابع درهمساز رمزنگارانه

استاندارد اکس۵۰۹

تابع درهمسازی

زنجیره بلوکی

## منابع
 
رده:الگوریتم‌های رمزنگاری