به فرآیند تبدیل کردن یک رشته کاراکتر به یک مقدار کوتاه تر با اندازه ثابت (این مقدار یا Value به عنوان Hash Value یا Hash Code یا Hash Sum یا Checksum شناخته می شود) که در نهایت نمایانگر رشته اصلی باشد در هم سازی یا Hashing گفته می شود. معمولا برای انجام این عملیات یک تابع یا Function انجام می شود که به تابع درهم سازی یا Hash Function معروف است. از الگوریتم های درهم سازی یا Hashing برای Indexing و بدست آوردن داده ها در پایگاه های داده بیشتر استفاده می شود زیرا سریعتر هستند، جستجو کردن بین مقادیر Hash با اندازه ثابت بسیار سریعتر از جستجو کردن مقدار اولیه است که ممکن است بسیار طولانی باشد. رمزنگاری یا Encryption به فرآیندی گفته می شود که داده های ما تبدیل به یک قالب جدید می شوند که برای افراد غیر مجاز غیر قابل درک است و فقط افراد مجاز دارای دسترسی می توانند محتویات داده را به صورت مناسب مشاهده کنند. به این قالب جدید داده ای که ایجاد می شود متن رمزنگاری شده یا Ciphertext گفته می شود به فرآیند بازگردانی Ciphertext به قالب اصلی داده در اصطلاح رمزگشایی یا Decryption گفته می شود.
Hashing یا درهم سازی چیست؟
همانطور که در پاراگراف اول هم اشاره کردیم فرآیند Hashing یا درهم سازی به تبدیل کردن یک رشته داده به یک مقدار یا رشته با اندازه ثابت که این رشته یا مقدار خروجی نمایانگر رشته اصلی باشد گفته می شود. تصور کنید که شما یک فایل متنی با 10 هزار خط متن را به یک الگوریتم درهم سازی یا Hashing می سپارید و خروجی آن یک رشته داده 128 بیتی خواهد بود، در همین حین اگر شما یک فایل متنی با 1 خط متن هم به همین الگوریتم درهم سازی یا Hashing تحویل دهید در نهایت خروجی شما نیز یک رشته داده 128 بیتی خواهد بود. تصور کنید شما هزاران فایل داده دارید با حجم های مختلف که می خواهید در آنها جستجو کنید، به جای اینکه به دنبال فایل اصلی بگردید کافیست که فقط به دنبال مقدار Hash مورد نظر بگردید و این فرآیند جستجوی شما را در پایگاه های داده بسیار سریع می کند. یکی از پر کاربردترین استفاده های یک تابع درهم سازی یا Hashing Function در پایگاه داده های وب سایت ها یا حتی سیستم خود شما برای نگهداری رمزهای عبور است. تمامی رمزهای عبوری که در پایگاه داده یک وب سایت ذخیره می شوند به حالت Hash شده نگهداری می شوند، این یعنی اینکه اگر رمز عبور شما 1 کاراکتر باشد و یا اینکه 100 کاراکتر باشد در نهایت بصورت مثلا یک رشته داده 128 بیتی در پایگاه داده بصورت درهم سازی شده نگهداری می شود. هر بار که شما می خواهید به وب سایت وارد شوید، رمز عبور شما دریافت می شود و تبدیل به مقدار یا Hash Value می شود و با پایگاه داده مورد نظر مقایسه می شود، اگر مقادیر برابر بود یعنی رمز شما درست است، دیگر فرقی نمی کند رمز شما یک کاراکتر باشد یا ده ها کاراکتر در نهایت سرعت جستجو در چنین حالتی بسیار بالا خواهد رفت.
نکته مهم در خصوص توابع درهم سازی یا Hashing Function ها این است که شما هر چقدر هم که اندازه فایل داده ورودی داشته باشید در نهایت یک رشته داده مشخص خروجی خواهید داشت و حتی اگر یک بیت از داده های اولیه شما تغییر کند، خروجی شما کاملا متفاوت خواهد بود و این یعنی اینکه می توان با استفاده از الگوریتم های درهم سازی یا Hashing صحت داده های شما را بررسی کرد، همان کاری که در بررسی رمزهای عبور شما انجام می شود. شما اگر می خواهید از صحت و تمامیت داده ارسالی یا دریافتی خود در مسیر یک شبکه اطمینان حاصل کنید کافیست به جای اینکه به ازای هر بیت ارسالی یک بسته تاییدیه یا Acknowledge دریافت کنید، ابتدا در مبدا از فایل خود یک مقدار Hash تهیه کنید و بعد از رسیدن به مقصد نیز مجددا از فایل خود یک Hash تهیه کنید و مقادیر را با هم مقایسه کنید، در صورتیکه مقادیر شما یکسان باشد فایل شما حتی اگر چند ترابایت داده نیز داشته باشد قطعا سالم و درست خواهد بود. نکته بسیار مهم در خصوص الگوریتم های درهم سازی یا Hashing این است که شما می توانید داده های خود را به مقادیر Hash تبدیل کنید اما به هیچ عنوان نمی توانید از مقادیر Hash داده های خود را استخراج کنید. یعنی شما می توانید یک فایل یک ترابایتی داده را تبدیل به یک مقدار 128 بیتی Hash کنید اما قطعا نمی توانید از این مقدار Hash داده یک ترابایتی خود را استخراج کنید، به همین دلیل است که از الگوریتم های درهم سازی یا Hashing به عنوان الگوریتم های رمزنگاری یک طرفه یا One Way یاد می شود یعنی داده فقط تبدیل به مقدار Hash می شود و عکس این عمل قطعا انجام نخواهد شد. البته از الگوریتم های درهم سازی یا Hashing در مصارف یا بهتر بگوییم در الگوریتم های دیگر رمزنگاری بصورت ترکیبی نیز استفاده می شود که از جمله آنها می توانیم به استفاده از Hashing در رمزنگاری و رمزگشایی امضاهای دیجیتال اشاره کنیم. خروجی الگوریتم های درهم سازی یا Hashing به هیچ عنوان در صورت متفاوت بودن ورودی های داده ای آن یکسان نخواهد بود مگر اینکه داده ورودی یکسان باشد.
تصویر زیر Hash شده اسم سایت ما یعنی Saeed.ws به فرمت های مختلف Hash را نمایش می دهد.
رمزنگاری یا Encryption چیست؟
همانطور که در پاراگراف اول نیز اشاره کردیم فرآیند رمزنگاری یا Encryption به تبدیل کردن داده ها به قالبی که فقط افراد مجاز می توانند آن را مشاهده کنند گفته می شود ، در این تبدیل قالب داده تبدیل شده را در اصطلاح Cipher-Text می نامیم. فرآیند رمزنگاری یا Encryption دارای قدمت چند هزار ساله می باشد و به انواع و اقسام روش ها از آسان تا سخت طبقه بندی می شود. مهمترین نکته ای که در خصوص رمزنگاری وجود دارد این است که فرآیند رمزنگاری شما متناسب با اندازه و مقدار داده های شما می باشد و با اضافه شدن میزان داده های اطلاعاتی به الگوریتم های رمزنگاری طبیعتا Cipher-Text های خروجی نیز دارای اندازه متناسبی می باشند. شما برخلاف الگوریتم های درهم سازی یا Hashing در الگوریتم های رمزنگاری یا Encryption می توانید از داده های رمزنگاری شده داده های خود را بیرون بیاورید و به این عملیات رمزگشایی یا Decryption گفته می شود. در فرآیند رمزگشایی شما حتما باید به عنوان یک کاربر مجاز کلید رمزگشایی الگوریتم رمزنگاری متناظر را بایستی داشته باشید تا بتوانید فرآیند رمزگشایی را به درستی انجام دهید. الگوریتم رمزنگاری یا Encryption ای به عنوان الگوریتم رمزنگاری قوی شناخته می شود که بدون داشتن کلید رمزگشایی نشود به داده های آن دسترسی پیدا کرد. انواع و اقسام الگوریتم های رمزنگاری وجود دارد که مهمترین طبقه بندی آنها الگوریتم های رمزنگاری متقارن و نامتقارن هستند، در الگوریتم های رمزنگاری متقارن همان کلیدی که برای رمزنگاری استفاده شده است برای رمزگشایی نیز استفاده می شود اما در الگوریتم های رمزنگاری نامتقارن یا PKI از دو کلید عمومی و خصوصی برای رمزنگاری و رمزگشایی استفاده می شود که از درجه امنیت بسیار بالایی برخوردار است.
تفاوت Hashing و Encryption در چیست؟
درهم سازی داده ها یا Hashing به یک فرآیند یک طرفه گفته می شود که در آن هر نوع داده خروجی در نهایت تبدیل به یک رشته داده خروجی با یک اندازه ثابت می شود که به آن Hash Value یا مقدار تابع درهم سازی گفته می شود. شما نمی توانید از یک Hash Value داده خود را برداشت کنید زیرا این نوع الگوریتم ها کاملا یک طرفه هستند و بیشتر برای تسریع فرآیند جستجو و اطمینان از صحت داده ها در هنگام انتقال مورد استفاده قرار می گیرند. الگوریتم هایی مثل MD و SHA از انواع الگوریتم های درهم سازی یا Hashing هستند که بیشترین استفاده را دارند. رمزنگاری یا Encryption به تبدیل داده ها به قالبی گفته می شود که فقط برای کاربران مجاز قابل مشاهده باشد و هیچ کاربر غیرمجازی نتواند داده واقعی را مشاهده کند. به داده ای که رمزنگاری شده باشد در اصطلاح Cipher-Text گفته می شود، اندازه داده ای که رمزنگاری می شود با حجم داده ورودی آن تا حدود زیادی یکسان است و شما می توانید از داده های رمزنگاری شده داده خود را خارج کنید که به این فرآیند رمزگشایی گفته می شود. الگوریتم های رمزنگاری بصورت کلی به دو دسته متقارن با یک کلید برای رمزنگاری و همان کلید برای رمزگشایی و نامتقارن که دارای دو کلید عمومی و خصوصی برای رمزنگاری و رمزگشایی می شوند تقسیم بندی می شود.