CRYPT(5) File Formats Manual CRYPT(5)

crypt — قالب ذخیره‌سازی برای عبارت‌های عبور هش‌شده و روش‌های درهم‌سازی موجود

روش‌های درهم‌سازی پیاده‌سازی‌شده توسط crypt(3) تنها برای پردازش عبارت‌های عبور کاربران جهت ذخیره‌سازی و احراز هویت طراحی شده‌اند؛ آن‌ها برای استفاده به‌عنوان هش‌های رمزنگاری عمومی مناسب نیستند.

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

بیشتر روش‌های درهم‌سازی از یک “نمک” (salt) برای دگرگون کردن تابع درهم‌سازی استفاده می‌کنند، به طوری که یک عبارت عبور یکسان بتواند مقادیر هش احتمالی متعددی را تولید کند. روش‌های جدیدتر رشته‌های نمک طولانی‌تری را می‌پذیرند. نمک باید برای هر کاربر به‌صورت تصادفی انتخاب شود. نمک چندین حمله را خنثی می‌کند:

  1. نمی‌توان یک عبارت عبور را تنها یک بار هش کرد و سپس آن را در برابر هش ذخیره‌شده هر حساب آزمایش نمود؛ محاسبه درهم‌سازی باید برای هر حساب کاربری تکرار شود.
  2. نمی‌توان بدون حدس زدن موفقیت‌آمیز یکی از عبارت‌ها، تشخیص داد که آیا دو حساب کاربری از یک عبارت عبور یکسان استفاده می‌کنند یا خیر.
  3. جدول‌های هش‌های از پیش محاسبه‌شده برای عبارت‌های عبور پرکاربرد، باید برای هر نمک ممکن یک مدخل داشته باشند، که این امر اندازه آن‌ها را به شکلی غیرعملی بزرگ می‌سازد.

بیشتر روش‌های درهم‌سازی همچنین عمداً طوری مهندسی شده‌اند که کُند باشند؛ آن‌ها از تکرارهای بسیار یک عنصر اولیه رمزنگاری زیربنایی برای افزایش هزینه هر بار حدس زدن استفاده می‌کنند. روش‌های درهم‌سازی جدیدتر اجازه می‌دهند تعداد تکرارها با استفاده از پارامتر “هزینه پردازش” (processing cost) در crypt_gensalt(3) تنظیم شود. برای روش‌های درهم‌سازی وابسته به حافظه (memory-hard) مانند yescrypt، این پارامتر همچنین مقدار حافظه مورد نیاز برای محاسبه یک هش را تنظیم می‌کند. قابلیت پیکربندی این مورد امکان‌پذیر می‌سازد که با بهبود سخت‌افزار، حملات حدس گذرواژه در برابر هش‌ها همچنان کُند و پرهزینه باقی بمانند.

تمام روش‌های درهم‌سازی پشتیبانی‌شده توسط crypt(3) یک عبارت عبور هش‌شده تولید می‌کنند که از چهار مؤلفه تشکیل شده است: prefix, options, salt و hash. مؤلفه prefix مشخص می‌کند که کدام روش درهم‌سازی باید استفاده شود، و رشته مناسبی است که برای انتخاب آن روش به crypt_gensalt(3) داده می‌شود. محتوای options, salt و hash به روش بستگی دارد. بسته به روش، مؤلفه‌های prefix و options ممکن است خالی باشند.

آرگومان setting در crypt(3) باید با سه مؤلفه اول یک عبارت عبور هش‌شده معتبر آغاز شود، اما هر چیزی پس از آن نادیده گرفته می‌شود. این امر احراز هویت را ساده می‌کند: عبارت‌عبور ورودی را با استفاده از عبارت‌عبور هش‌شدهٔ ذخیره‌شده به‌عنوان تنظیمات هش کرده، و سپس نتیجه را با عبارت‌عبور هش‌شدهٔ ذخیره‌شده مقایسه کنید.

عبارت‌های عبور هش‌شده همیشه تماماً از نویسه‌های اسکی قابل‌چاپ تشکیل شده‌اند، و شامل هیچ فاصلهٔ خالی یا نویسه‌های ‘: ،’ ‘; ،’ ‘* ،’ ‘! ،’ یا ‘\’ نمی‌باشند. (این نویسه‌ها به‌عنوان جداکننده و نشانگرهای ویژه در پرونده‌های passwd(5) و shadow(5) استفاده می‌شوند.)

نحو هر جزء از یک عبارت‌عبور هش‌شده به روش درهم‌سازی بستگی دارد. نویسه‌های ‘$’ معمولاً اجزا را از یکدیگر جدا می‌کنند، و سالت و هش معمولاً به‌صورت ارقام در مبنای ۶۴ کدگذاری می‌شوند. جزئیات این کدگذاری مبنای ۶۴ در میان روش‌های درهم‌سازی مختلف متفاوت است. کدگذاری رایج “base64” مشخص‌شده توسط RFC 4648 معمولاً استفاده نمی‌شود.

این فهرستی از تمامی روش‌های درهم‌سازی پشتیبانی‌شده توسط crypt(3) است، که تقریباً به ترتیب نزولی قدرت مرتب شده‌اند. بسیاری از روش‌های قدیمی‌تر اکنون برای استفاده در عبارت‌های عبور جدید بسیار ضعیف در نظر گرفته می‌شوند. قالب عبارت‌عبور هش‌شده با عبارات منظم گسترده بیان می‌شود (نگاه کنید به regex(7)) و تفکیک به پیشوند، گزینه‌ها، سالت و هش را نشان نمی‌دهد.

روش yescrypt یک طرح درهم‌سازی عبارت‌عبور مقیاس‌پذیر طراحی‌شده توسط Solar Designer است، که بر پایهٔ scrypt اثر Colin Percival بنا شده است. در حالی که قدرت yescrypt در برابر حملات حدس رمز عبور از طراحی الگوریتم آن سرچشمه می‌گیرد، امنیت رمزنگاری آن با استفاده از SHA-256 در لایهٔ بیرونی تضمین می‌شود. تابع درهم‌سازی SHA-256 توسط NIST در FIPS PUB 180-2 (و بازنگری‌های بعدی آن نظیر FIPS PUB 180-4) و توسط IETF به‌عنوان RFC 4634 (و پس از آن RFC 6234) منتشر شده است. برای هش‌های جدید توصیه می‌شود.

پیشوند
"$y$"
قالب عبارت‌عبور هش‌شده
\$y\$[./A-Za-z0-9]+\$[./A-Za-z0-9]{,86}\$[./A-Za-z0-9]{43}
بیشینه طول عبارت‌عبور
نامحدود
اندازه هش
256 بیت
اندازه سالت
up to 512 (128+ recommended) بیت
پارامتر هزینه پردازش
1 to 11 (logarithmic, also affects memory usage)

روش gost-yescrypt از خروجی yescrypt به‌عنوان پیام ورودی برای HMAC همراه با تابع درهم‌سازی GOST R 34.11-2012 (Streebog) با خلاصه ۲۵۶ بیتی استفاده می‌کند. بدین ترتیب، ویژگی‌های رمزنگاری yescrypt جای خود را به ویژگی‌های تابع درهم‌سازی GOST می‌دهند. این روش درهم‌سازی در برنامه‌هایی کاربرد دارد که به درهم‌سازی مدرن عبارت‌عبور نیاز دارند، اما ناچار به اتکا بر الگوریتم‌های GOST هستند. تابع درهم‌سازی GOST R 34.11-2012 (Streebog) توسط IETF به‌عنوان RFC 6986 منتشر شده است. در صورت لزوم برای هش‌های جدید قابل قبول است.

پیشوند
"$gy$"
قالب عبارت‌عبور هش‌شده
\$gy\$[./A-Za-z0-9]+\$[./A-Za-z0-9]{,86}\$[./A-Za-z0-9]{43}
بیشینه طول عبارت‌عبور
نامحدود
اندازه هش
256 بیت
اندازه سالت
up to 512 (128+ recommended) بیت
پارامتر هزینه پردازش
1 to 11 (logarithmic, also affects memory usage)

روش sm3-yescrypt از خروجی yescrypt به‌عنوان پیام ورودی برای HMAC همراه با تابع درهم‌سازی ShangMi 3 با خلاصه ۲۵۶ بیتی استفاده می‌کند. بدین ترتیب، ویژگی‌های رمزنگاری yescrypt جای خود را به ویژگی‌های تابع درهم‌سازی ShangMi 3 می‌دهند. این روش درهم‌سازی در برنامه‌هایی کاربرد دارد که به درهم‌سازی مدرن عبارت‌عبور نیاز دارند، اما ناچار به اتکا بر الگوریتم‌های مورد تایید اداره رمزنگاری تجاری دولتی چین (OSCCA) هستند. اداره رمزنگاری تجاری دولتی (OSCCA). تابع درهم‌سازی ShangMi 3 در بخش ۳: "Dedicated hash-functions" از استاندارد ISO/IEC 10118-3:2018 منتشر شده است. در صورت نیاز برای هش‌های جدید قابل قبول است.

پیشوند
"$sm3y$"
قالب عبارت‌عبور هش‌شده
\$sm3y\$[./A-Za-z0-9]+\$[./A-Za-z0-9]{,86}\$[./A-Za-z0-9]{43}
بیشینه طول عبارت‌عبور
نامحدود
اندازه هش
256 بیت
اندازه سالت
up to 512 (128+ recommended) بیت
پارامتر هزینه پردازش
1 to 11 (logarithmic, also affects memory usage)

روش scrypt یک تابع اشتقاق کلید مبتنی بر رمز عبور ایجادشده توسط Colin Percival است، که در اصل برای سرویس پشتیبان‌گیری برخط Tarsnap ساخته شد. این الگوریتم به‌طور ویژه طوری طراحی شده است که با نیازمندی به مقادیر زیادی حافظه، انجام حملات سخت‌افزاری سفارشی در مقیاس بزرگ را بسیار پرهزینه کند. در سال ۲۰۱۶، الگوریتم scrypt توسط IETF به‌عنوان RFC 7914 منتشر شد.

پیشوند
"$7$"
قالب عبارت‌عبور هش‌شده
\$7\$[./A-Za-z0-9]{11,97}\$[./A-Za-z0-9]{43}
بیشینه طول عبارت‌عبور
نامحدود
اندازه هش
256 بیت
اندازه سالت
up to 512 (128+ recommended) بیت
پارامتر هزینه پردازش
6 to 11 (logarithmic, also affects memory usage)

یک هش مبتنی بر رمز قالبی Blowfish، که برای داشتن یک جدول زمان‌بندی کلید فوق‌العاده پرهزینه اصلاح شده است. در ابتدا توسط Niels Provos و David Mazieres برای OpenBSD توسعه یافت و همچنین در نسخه‌های اخیر FreeBSD و NetBSD، در Solaris 10 و جدیدتر، و در چندین توزیع گنو/لینوکس پشتیبانی می‌شود.

پیشوند
"$2b$"
قالب عبارت‌عبور هش‌شده
\$2[abxy]\$[0-9]{2}\$[./A-Za-z0-9]{53}
بیشینه طول عبارت‌عبور
72 نویسه
اندازه هش
184 بیت
اندازه سالت
128 بیت
پارامتر هزینه پردازش
4 to 31 (logarithmic)

پیشوند جایگزین "$2y$" معادل "$2b$" است. این پیشوند تنها به دلایل تاریخی وجود دارد. پیشوندهای جایگزین "$2a$" و "$2x$" سازگاری با باگ‌های موجود در نسخه‌های 1.0.4 و قدیمی‌تر crypt_blowfish را فراهم می‌کنند، که نویسه‌های دارای بیت هشتم را به‌صورت نادرست پردازش می‌کردند.

یک هش مبتنی بر SHA-2 با خروجی ۵۱۲ بیتی، که در ابتدا توسط Ulrich Drepper برای کتابخانه GNU libc توسعه یافت. در لینوکس پشتیبانی می‌شود اما در جاهای دیگر رایج نیست. برای هش‌های جدید قابل قبول است. پارامتر هزینه پردازش پیش‌فرض 5000 است، که برای سخت‌افزارهای امروزی بسیار پایین است.

پیشوند
"$6$"
قالب عبارت‌عبور هش‌شده
\$6\$(rounds=[1-9][0-9]+\$)?[^$:\n]{1,16}\$[./0-9A-Za-z]{86}
بیشینه طول عبارت‌عبور
نامحدود
اندازه هش
512 بیت
اندازه سالت
6 to 96 بیت
پارامتر هزینه پردازش
1000 to 999,999,999

یک هش مبتنی بر SHA-2 با خروجی ۲۵۶ بیتی، که در ابتدا توسط Ulrich Drepper برای کتابخانه GNU libc توسعه یافت. در لینوکس پشتیبانی می‌شود اما در جاهای دیگر رایج نیست. برای هش‌های جدید قابل قبول است. پارامتر هزینه پردازش پیش‌فرض 5000 است، که برای سخت‌افزارهای امروزی بسیار پایین است.

پیشوند
"$5$"
قالب عبارت‌عبور هش‌شده
\$5\$(rounds=[1-9][0-9]+\$)?[^$:\n]{1,16}\$[./0-9A-Za-z]{43}
بیشینه طول عبارت‌عبور
نامحدود
اندازه هش
256 بیت
اندازه سالت
6 to 96 بیت
پارامتر هزینه پردازش
1000 to 999,999,999

یک هش مبتنی بر تابع درهم‌سازی ShangMi 3 با خروجی ۲۵۶ بیتی، که از همان طراحی sha256crypt و/یا sha512crypt استفاده می‌کند. در توزیع‌های EulerOS، Kylin، openEuler و openKylin پشتیبانی می‌شود، اما در جاهای دیگر رایج نیست. در صورت نیاز برای هش‌های جدید قابل قبول است. پارامتر هزینه پردازش پیش‌فرض 5000 است، که برای سخت‌افزارهای امروزی بسیار پایین است.

پیشوند
"$sm3$"
قالب عبارت‌عبور هش‌شده
\$sm3\$(rounds=[1-9][0-9]+\$)?[^$:\n]{1,16}\$[./0-9A-Za-z]{86}
بیشینه طول عبارت‌عبور
نامحدود
اندازه هش
256 بیت
اندازه سالت
6 to 96 بیت
پارامتر هزینه پردازش
1000 to 999,999,999

یک هش مبتنی بر HMAC-SHA1. در ابتدا توسط Simon Gerraty برای NetBSD توسعه یافت. نه به اندازه هش‌های مبتنی بر DES در زیر ضعیف است، اما SHA-1 در سخت‌افزارهای مدرن بسیار ارزان است به طوری که نباید برای هش‌های جدید استفاده شود.

پیشوند
"$sha1"
قالب عبارت‌عبور هش‌شده
\$sha1\$[1-9][0-9]+\$[./0-9A-Za-z]{1,64}\$[./0-9A-Za-z]{8,64}[./0-9A-Za-z]{32}
بیشینه طول عبارت‌عبور
نامحدود
اندازه هش
160 بیت
اندازه سالت
6 to 384 بیت
پارامتر هزینه پردازش
4 to 4,294,967,295

یک هش مبتنی بر الگوریتم MD5، که در ابتدا توسط Alec David Muffett برای Solaris توسعه یافت. تا جایی که می‌دانیم در جای دیگری به کار گرفته نشده است. نه به اندازه هش‌های مبتنی بر DES در زیر ضعیف است، اما MD5 در سخت‌افزارهای مدرن بسیار ارزان است به طوری که نباید برای هش‌های جدید استفاده شود.

پیشوند
"$md5"
قالب عبارت‌عبور هش‌شده
\$md5(,rounds=[1-9][0-9]+)?\$[./0-9A-Za-z]{8}\${1,2}[./0-9A-Za-z]{22}
بیشینه طول عبارت‌عبور
نامحدود
اندازه هش
128 بیت
اندازه سالت
48 بیت
پارامتر هزینه پردازش
4096 to 4,294,963,199

یک هش مبتنی بر الگوریتم MD5، که در ابتدا توسط Poul-Henning Kamp برای FreeBSD توسعه یافت. در بیشتر سیستم‌های شبه‌یونیکس آزاد و نسخه‌های جدیدتر Solaris پشتیبانی می‌شود. نه به اندازه هش‌های مبتنی بر DES در زیر ضعیف است، اما MD5 در سخت‌افزارهای مدرن بسیار ارزان است به طوری که نباید برای هش‌های جدید استفاده شود. هزینه پردازش قابل تنظیم نیست.

پیشوند
"$1$"
قالب عبارت‌عبور هش‌شده
\$1\$[^$:\n]{1,8}\$[./0-9A-Za-z]{22}
بیشینه طول عبارت‌عبور
نامحدود
اندازه هش
128 بیت
اندازه سالت
6 to 48 بیت
پارامتر هزینه پردازش
1000

یک توسعه از DES سنتی، که محدودیت طول را حذف می‌کند، اندازه سالت را افزایش می‌دهد، و هزینه زمانی را قابل تنظیم می‌سازد. از BSDI BSD/OS سرچشمه می‌گیرد و به دلیل استفاده از کتابخانه FreeSec اثر David Burren دست‌کم در NetBSD، OpenBSD و FreeBSD نیز در دسترس است. بسیار بهتر از DES سنتی و bigcrypt است، اما همچنان نباید برای هش‌های جدید استفاده شود.

پیشوند
"_"
قالب عبارت‌عبور هش‌شده
_[./0-9A-Za-z]{19}
بیشینه طول عبارت‌عبور
نامحدود (بیت هشتم را نادیده می‌گیرد)
اندازه هش
64 بیت
اندازه کلید موثر
up to 56 بیت
اندازه سالت
24 بیت
پارامتر هزینه پردازش
1 to 16,777,215 (must be odd)

روش اصلی درهم‌سازی از Unix V7، مبتنی بر رمز قالبی DES. از آنجا که DES در سخت‌افزارهای مدرن ارزان است، و از آنجا که تنها ۴۰۹۶ سالت ممکن و ۲ به توان ۵۶ عبارت‌عبور متمایز وجود دارد، که آن را به ۸ نویسه کوتاه می‌کند، کشف هر عبارت‌عبوری که با این روش هش شده باشد امکان‌پذیر است. تنها در صورتی باید استفاده شود که کاملاً مجبور به تولید هش‌هایی باشید که روی یک سیستم‌عامل قدیمی که از چیز دیگری پشتیبانی نمی‌کند کار کنند.

پیشوند
""
(رشته خالی)
قالب عبارت‌عبور هش‌شده
[./0-9A-Za-z]{13}
بیشینه طول عبارت‌عبور
8 نویسه (بیت هشتم را نادیده می‌گیرد)
اندازه هش
64 بیت
اندازه کلید موثر
up to 56 بیت
اندازه سالت
12 بیت
پارامتر هزینه پردازش
25

یک توسعه ضعیف از DES سنتی، موجود در برخی از یونیکس‌های تجاری. تنها کاری که انجام می‌دهد این است که محدودیت طول را از ۸ به ۱۲۸ نویسه افزایش می‌دهد، و این کار را به روشی ابتدایی انجام می‌دهد که به مهاجمان اجازه می‌دهد بخش‌هایی از یک عبارت‌عبور طولانی را به‌صورت جداگانه و موازی حدس بزنند، که ممکن است حدس زدن را حتی از DES سنتی در بالا آسان‌تر کند. نباید برای هش‌های جدید استفاده شود.

پیشوند
""
(رشته خالی)
قالب عبارت‌عبور هش‌شده
[./0-9A-Za-z]{13,178}
بیشینه طول عبارت‌عبور
128 نویسه (بیت هشتم را نادیده می‌گیرد)
اندازه هش
up to 1024 بیت
اندازه کلید موثر
up to 56 بیت
اندازه سالت
12 بیت
پارامتر هزینه پردازش
25

روش درهم‌سازی استفاده‌شده برای احراز هویت شبکه در برخی از نسخه‌های پروتکل SMB/CIFS. به‌منظور سازگاری متقابل، در FreeBSD موجود است. مبتنی بر MD4. فاقد سالت یا پارامتر هزینهٔ قابل‌تنظیم است. آن‌قدر ضعیف است که تقریباً هر عبارت‌عبور انتخاب‌شده توسط انسان که با این روش هش شود، قابل‌حدس است. تنها زمانی باید استفاده شود که قطعاً مجبور به تولید هش‌هایی باشید که روی یک سیستم‌عامل قدیمی که از چیز دیگری پشتیبانی نمی‌کند، کار کنند.

پیشوند
"$3$"
قالب عبارت‌عبور هش‌شده
\$3\$\$[0-9a-f]{32}
بیشینه طول عبارت‌عبور
نامحدود
اندازه هش
256 بیت
اندازه سالت
0 بیت
پارامتر هزینه پردازش
1

crypt(3), crypt_gensalt(3), getpwent(3), passwd(5), shadow(5), pam(8) Niels Provos and David Mazieres, A Future-Adaptable Password Scheme, Proceedings of the 1999 USENIX Annual Technical Conference, https://www.usenix.org/events/usenix99/provos.html, June 1999. Robert Morris and Ken Thompson, Password Security: A Case History, Communications of the ACM, 11, 22, http://wolfram.schneider.org/bsd/7thEdManVol2/password/password.pdf, 1979.

March 27, 2024 Openwall Project