DKIM یا DomainKeys Identified Mail پروتکلی است که با استفاده از آن، فرستنده یک امضای دیجیتال به هر ایمیل اضافه می‌کند، تا احراز هویت و اصالت‌سنجی برای گیرنده انجام شود. به‌عبارتی DKIM یکی از راه‌کارهای احراز هویت فرستنده‌ی ایمیل است.
DKIM با ایجاد ارتباط بین ایمیل و دامنه، به گیرنده امکان می‌دهد اصالت هویت فرستنده را تایید کند. این پروتکل با یک رکورد از نوع TXT در فایل تنظیمات DNS Zone دامنه ایجاد می‌شود.
این ارتباط در گام اول با به‌کارگیری کلید خصوصی، رمزنگاری، ایجاد امضای دیجیتال و افزودن آن به Header ایمیل ارسالی انجام می‌شود.
در گام دوم فرستنده کلید عمومی‌ را منتشر می‌کند و گیرنده امضای دیجیتال را صحت‌سنجی می‌کند. به این ترتیب DKIM به رفع مشکل تشخیص ایمیل‌های جعلی کمک می‌کند. هم‌چنین این پروتکل در کنار SPF در پیاده‌سازی خط‌مشی‌های پروتکل DMARC، نقش مکمل ایفا می‌کند.

عملکرد  DKIM

کارکرد کلی DKIM شامل ساخت امضای DKIM در سمت فرستنده و تایید امضای دیجیتال DKIM در سمت گیرنده است.

ساخت امضای DKIM

ابتدا تمام فاصله‌ها و فضاهای خالی بین کلمات متن ایمیل، به همراه بخشی از Header که در رکورد DKIM مشخص می‌شوند، حذف می‌شود. به این عمل Canonicalization گفته می‌شود. در این حالت یک رشته متن به‌هم‌چسبیده به دست می‌آید.
دلیل این حرکت این است که ایمیل در گذر از سرورهای مختلف، تا رسیدن به مقصد، ممکن است فرمت‌های ظاهری مختلفی پیدا کند. با این حذف‌ها مطمین می‌شوید که چه در سمت فرستنده و چه در سمت گیرنده رشته متن واحدی، به تابع درهم‌ساز یا Hash داده می‌شود. این رشته متن در ازای ورودی به هر تابع هشِ مشخص، خروجی ثابتی دارد.
در گام‌های بعدی می‎بینیم که این قابلیت یکسان بودن خروجی تابع هش، در سمت گیرنده نشان می‌دهد که محتوای اصلی در انتقال دستکاری نشده است.
به شکل خلاصه، هش، تابع ریاضی است که به ازای هر رشته ورودی یکسان، خروجی ثابت و منحصر‌به‌فردی تولید می‌کند. این تابع یک‌سویه است؛ به این معنی که از خروجی نمی‌توان به مقدار ورودی دست یافت. از موارد کاربرد این تابع در دنیای کامپیوتر و به‌خصوص شبکه، می‌توان به آزمون صحت انتقال و یکپارچگی داده بر روی لینک‌های شبکه و دنیای اینترنت اشاره کرد. چون اگر مثلن با محاسبه‌ی مقدار هش داده‌ها در دو سمت دریافت‌کننده‌‌ و ارسال‌کننده، به مقدار برابری برسیم، می‌توان نتیجه گرفت که داده‌های دریافتی بدون هیچ‌گونه خطا و دست‌کاری دریافت شده است.

سپس، مقدار هش رشته‌ی متن Canonicalization شده محاسبه می‌شود.در ادامه، مالک دامنه با استفاده از کلید خصوصی، جفت‌کلیدی که در اختیار دارد، خروجی هش گام دوم را رمزگذاری می‌کند. دقت داشته باشید که در هنگام ارسال ایمیل از سوی فرستنده، هم هش به‌دست‌آمده در گام دوم و هم خروجی رمزگذاری این گام، در بخش DKIM در Header ایمیل ارسالی قرار می‌گیرند.

هر چه که برای رمزگشایی و احراز هویت مورد نیاز است، توسط فرستنده در محتوای Header قرار داده شده بر روی هر ایمیل، گنجانده می‌شود. مانند کلید عمومی‌ و تگ‌هایی از Header که در محاسبه‌ی هش نقش دارند. در نهایت مالک دامنه، کلید عمومی‌ را برای دسترسی‌های آتی گیرندگان احتمالی، در رکوردی از نوع TXT و با ویژگی DKIM قرار می‌دهد.

تایید امضای دیجیتال DKIM

گیرنده هم عمل Canonicalization یا حذف فاصله‌ها و فضاهای خالی را انجام می‌دهد. این امر از طریق اطلاع از Headerهای به‌کاررفته در تگ h انجام می‌شود. سپس مقدار هش Header و محتوای پیام ساخته می‌شود.

در ادامه کلید عمومی از طریق درخواست DNS، از دامنه‌ی مبدا دریافت می‌شود.

در این گام، گیرنده با استفاده از کلید عمومی، با امضای دیجیتال (محتوای رمزگذاری‌شده) گام سومِ بخش قبل را رمزگشایی می‌کند. با این‌کار، به هشی که توسط فرستنده از Header و متن پیام محاسبه شده بود می‌رسد. اگر این محتوای هش، با محتوای هشی که گیرنده محاسبه کرده، یکسان باشد، یعنی محتوای ایمیل و Header آن در انتقال، تغییر نکرده و دستکاری نشده است. به عبارت دیگر یکپارچگی یا Integrity داده‌ها حفظ شده است.

هم‌چنین، جواب دادن کلید عمومی ‌روی محتوای رمزگذاری‌شده، یعنی جفت‌کلیدش، نشان می‌دهد که کلید خصوصی که برای رمزگذاری استفاده شده، در اختیار همان دامنه‌ای است که ادعای مالکیت و ارسال ایمیل دارد. بنابراین از طریق کار کردن این جفت کلید، هویت فرستنده برای گیرنده تایید می‌شود.

نکته‌ی مهم دیگر آن است که در DKIM کل پیام و داده‌های ارسالی ایمیل رمزگذاری نمی‌شوند بلکه با کلید خصوصی، فقط از مجموع Hash شد‌ه‌ی داد‌ه‌های موجود در Header و متن پیام، رمزنگاری می‌شود؛ بنابراین اشتباه است اگر فکر کنیم DKIM  کل محتوای ایمیل را به شکل رمزنگاری درمی‌آورد و از دید دیگران مخفی می‌کند چون برایDKIM، یک ماهیت هدف در نظر گرفته شده که مشخص کردن یکپارچگی کل داده و احراز هویت فرستنده است، نه محرمانگی داده.
برای رمزنگاری و اعمال محرمانگی داده‌های ایمیل در حین انتقال، از پروتکل‌های مخصوص دیگری مانند STARTTLS یا رمزنگاری سرتاسری چون GNU Privacy Guard – GPG استفاده می‌شود. البته این رفتار DKIM حسن‌هایی هم دارد؛ محاسبه‌ی هشِ یک رشته متن به‌نسبت کوتاه، در مقایسه با رمزگشایی یک متن بلند رمزدار، به پردازش و زمان‌ بسیار کم‌تری نیاز دارد. به همین دلیل از سو استفاده و رخداد انواعی از حملات منع سرویس یا DoS جلوگیری می‌کند.
تصور کنید که قرار باشد سرور دریافت‌کنند‌ه‌ی ایمیل، فقط برای تشخیص هویت، متن رمزنگاری‌شده‌ای را رمزگشایی کند. با صرف چنین زمانی برای هر درخواست، مهاجم درخواست‌های نامعتبر مکرر می‌فرستد و منابع زیادی از سرور را درگیر می‌کند.

ساختار رکورد DKIM

همان‌طور که گفتیم رکورد DKIM در فایل تنظیمات DNS Zone دامنه قرار می‌گیرد. این رکورد، نوع خاصی از رکورد TXT است.

mail._domainkey.udefy.ir. 120   IN      TXT     "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDot4HMo9/gE9Zq9N5A+sPHLS4UlXIlmnVEbRxeRmDoQ8lwi7mR5pqFa8dQFfkeANXUO/tSMos3E3pq0REII0tLsLDBP74fvqytTCjJXEm8DkL0d3iWp1ksOQxJy/XcAFEDcUknMKab8yYk+OOiJc4rxQUxwZ1rLzHbYjusHJ9SMwIDAQAB"

این رکورد با عبارت example._domainkey.exampledomain.com آغاز می‌شود. بخش example که به نام  Selector شناخته می‌شود، نامی‌است که برای این DKIM در نظر گرفته شده است. محدودیتی در تعداد تعریف رکورد DKIM وجود ندارد؛ به همین دلیل می‌توان برای هر نوع ایمیلی، رکورد DKIM و در نتیجه، کلید عمومی‌ و خصوصی و امضای به‌خصوص تعریف کرد. مثلن می‌توان برای ایمیل‌های بازاریابی یک رکورد DKIM خاص و برای ایمیل‌های پشتیبانی DKIM دیگری به‌کار گرفت. توجه داشته باشید که example همان نامی‌است که در تگ s در header ایمیل ارسالی است.
عبارت بعد از آن، domainkey_.  است که جزو ساختار رکورد پروتکل DKIM محسوب می‌شود و برای ساخت چنین رکوردهایی باید به همین‌شکل نوشته شود exampledomain.com. نام دامنه‌ای است که در فایل DNS Zone آن در حال ایجاد رکورد DKIM هستید.

– TTL میزان زمانی است که سرورهای DNS داده‌های این رکورد را در خود ذخیره می‌کنند و TXT نوع رکورد DNS را مشخص می‌کند. اما قسمت اصلی کار در بخش Value اتفاق می‌افتد. در تگ v=DKIM1 نوع پروتکلی را که در رکورد TXT قصد به‌کارگیری‌اش را دارید مشخص می‌کنید. بنابراین در اینجا نام DKIM قرار گرفته است. عدد ۱ هم نسخه‌ی آن را مشخص می‌کند. توجه داشته باشید که مقادیر آن با حروف بزرگ نوشته شده است و همواره به عنوان اولین تگ، مورد استفاده قرار می‌گیرد.

تگ k نوع الگوریتم به‌کار رفته در کلید عمومی‌قرار گرفته در تگ p را مشخص می‌کند و تگ p هم حاوی کلید عمومی‌است که در اختیار هر گیرنده‌ی ایمیلی قرار می‌گیرد و از طریق آن صحت مقادیر هش‌شده و امضای دیجیتال با آن سنجیده می‌شوند.

ساختار امضای DKIM

امضای DKIM همان چیزی است که فرستنده روی Header هر ایمیل ارسالی اضافه می‌کند. همان‌طور که پیش‌تر گفته شد، این امضا شامل هر چیزی است که گیرنده برای احراز هویت و یکپارچگی داده‌ها نیاز دارد.

یک نمونه از آن را در اینجا بررسی می‌کنیم.

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=exampledomain.com; s=example; h=from:content-transfer-encoding:subject:message-id:date:to:mime-version; bh=ZkwViLQ8B7I9vFIen3+/FXErUuKv33PmCuZAwpemGco=; b=kF31DkXsbP5bMGzOwivNE4fmMKX5W2/Yq0YqXD4Og1fPT6ViqB35uLxLGGhHv2lqXBWwF hODPVPauUXxRYEpMsuisdU5TgYmbwSJYYrFLFj5ZWTZ7VGgg6/nI1hoPWbzDaL9qh

– v نسخه‌ی به‌کار رفته در DKIM را نشان می‌دهد.

– a نوع الگوریتم به‌کار رفته در رمزنگاری و هش را مشخص می‌کند.

– c یا Canonicalization میزان حساسیت و شیو‌ه‌هایی را نشان می‌دهد که در حذف فضاهای خالی در Header و متن اصلی پیام در سمت فرستنده برای ایجاد متن هش استفاده شده است. عبارت قبل از / حالت استفاده‌شده برای Header و عبارت بعد از آن برای Body را مشخص می‌کند.

– d نام دامنه‌ای است که بایستی گیرنده، درخواست DNS را برای آن بفرستد و کلید عمومی‌ را از آن بخواهد.

– هر نام دامنه می‌تواند چندین رکورد DKIM و کلید عمومی‌داشته باشد. به همین دلیل اینکه کدام کلید عمومی ‌استفاده شود، از طریق تگ s یا همان Selector مشخص می‌شود. در بخش ساختار DKIM توجه داشتید که عبارت example یا هر نام اختیاری دیگری، در واقع نام رکورد DKIM امضاکننده‌ی این پیام دریافتی را مشخص می‌کند. بنابراین تگ s در اینجا، در تناظر با نامی ‌است که در اول ساختار رکورد DKIM، به عنوان Selector استفاده شده است؛ مثلن در این‌جا example.

– h بیان‌گر Headerهایی است که در فرایند ایجاد هش در سمت سرور نقش داشته‌اند. از همین ‌Headerها برای ساخت هش در سمت گیرنده استفاده می‌‎شود.

– bh هشِ رمزنگاری‌نشده‌ محتوای body پیام را در بر دارد. توجه کنید که هش headerها با آن ادغام نشده است.

– b امضای داده‌ها یا همان متن رمزنگاری‌شده است که شامل Headerهای مشخص‌شده در تگ h و محتوای Body پیام است. توجه کنید که اگر گیرنده با کلید عمومی، این متنِ رمزنگاری‌‌شده را رمزگشایی کند، به متنِ هش‌‎شده‌ی ترکیب Header و محتوای Body  پیام دست پیدا می‌کند.

ثبت رکورد DKIM در پنل ابرآروان

برای ثبت نمونه رکورد در پنل آروان پس از انتخاب دامنه از پنل کاربری، روی رکوردهای DNS کلیک و یک رکورد TXT جدید ایجاد کنید.

ثبت رکورد با استفاده از API :

curl --location --request POST 'https://napi.arvancloud.ir/cdn/4.0/domains/example.com/dns-records'\

--header 'authority: napi.arvancloud.ir'\

--header 'accept: application/JSON, text/plain,*/*'\

--header 'authorization: APIKEY  1 2 3 4'\

--header 'cache-control: no-cache'\

--header 'content-type: application/json;charset=UTF-8'\

--header 'dnt: 1'\

--data-raw '{"type":"TXT","name":"mail._domainkey","cloud":true,"value":{"text":"v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDot4HMo9/gE9Zq9N5A+sPHLS4UlXIlmnVEbRxeRmDoQ8lwi7mR5pqFa8dQFfkeANXUO/tSMos3E3pq0REII0tLsLDBP74fvqytTCjJXEm8DkL0d3iWp1ksOQxJy/XcAFEDcUknMKab8yYk+OOiJc4rxQUxwZ1rLzHbYjusHJ9SMwIDAQAB"},"upstream_https":"default","ip_filter_mode":{"count":"single","geo_filter":"none","order":"none"},"ttl":120}'


Bind Format رکورد ثبت‌شده:

mail._domainkey.example.com. 120 IN     TXT     "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDot4HMo9/gE9Zq9N5A+sPHLS4UlXIlmnVEbRxeRmDoQ8lwi7mR5pqFa8dQFfkeANXUO/tSMos3E3pq0REII0tLsLDBP74fvqytTCjJXEm8DkL0d3iWp1ksOQxJy/XcAFEDcUknMKab8yYk+OOiJc4rxQUxwZ1rLzHbYjusHJ9SMwIDAQAB"

خروجی دستور dig: