.\" Written and revised by Solar Designer in 2000-2024. .\" Revised by Zack Weinberg in 2017. .\" Converted to mdoc format by Zack Weinberg in 2018. .\" .\" No copyright is claimed, and this man page is hereby placed in the public .\" domain. In case this attempt to disclaim copyright and place the man page .\" in the public domain is deemed null and void, then the man page is .\" Copyright 2000-2011 Solar Designer, 2017 Zack Weinberg, and it is .\" hereby released to the general public under the following terms: .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted. .\" .\" There's ABSOLUTELY NO WARRANTY, express or implied. .\" .Dd March 27, 2024 .Dt CRYPT 5 .Os "Openwall Project" .Sh "نام (NAME)" .Nm crypt .Nd قالب ذخیره‌سازی برای عبارت‌های عبور هش‌شده و روش‌های درهم‌سازی موجود .Sh "توضیحات (DESCRIPTION)" روش‌های درهم‌سازی پیاده‌سازی‌شده توسط .Xr crypt 3 تنها برای پردازش عبارت‌های عبور کاربران جهت ذخیره‌سازی و احراز هویت طراحی شده‌اند؛ آن‌ها برای استفاده به‌عنوان هش‌های رمزنگاری عمومی مناسب نیستند. .Pp درهم‌سازی عبارت عبور جایگزینی برای عبارت‌های عبور قوی نیست. همواره این امکان برای یک مهاجم با دسترسی به عبارت‌های عبور هش‌شده وجود دارد که عبارت‌های عبور متن‌ساده احتمالی را حدس بزند و بررسی کند. با این حال، با یک روش درهم‌سازی قوی، حدس زدن آن‌قدر برای مهاجم کُند خواهد بود که نتواند یک عبارت عبور قوی را کشف کند. .Pp بیشتر روش‌های درهم‌سازی از یک .Dq نمک (salt) برای دگرگون کردن تابع درهم‌سازی استفاده می‌کنند، به طوری که یک عبارت عبور یکسان بتواند مقادیر هش احتمالی متعددی را تولید کند. روش‌های جدیدتر رشته‌های نمک طولانی‌تری را می‌پذیرند. نمک باید برای هر کاربر به‌صورت تصادفی انتخاب شود. نمک چندین حمله را خنثی می‌کند: .Bl -enum .It نمی‌توان یک عبارت عبور را تنها یک بار هش کرد و سپس آن را در برابر هش ذخیره‌شده هر حساب آزمایش نمود؛ محاسبه درهم‌سازی باید برای هر حساب کاربری تکرار شود. .It نمی‌توان بدون حدس زدن موفقیت‌آمیز یکی از عبارت‌ها، تشخیص داد که آیا دو حساب کاربری از یک عبارت عبور یکسان استفاده می‌کنند یا خیر. .It جدول‌های هش‌های از پیش محاسبه‌شده برای عبارت‌های عبور پرکاربرد، باید برای هر نمک ممکن یک مدخل داشته باشند، که این امر اندازه آن‌ها را به شکلی غیرعملی بزرگ می‌سازد. .El .Pp بیشتر روش‌های درهم‌سازی همچنین عمداً طوری مهندسی شده‌اند که کُند باشند؛ آن‌ها از تکرارهای بسیار یک عنصر اولیه رمزنگاری زیربنایی برای افزایش هزینه هر بار حدس زدن استفاده می‌کنند. روش‌های درهم‌سازی جدیدتر اجازه می‌دهند تعداد تکرارها با استفاده از پارامتر .Dq "هزینه پردازش" (processing cost) در .Xr crypt_gensalt 3 تنظیم شود. برای روش‌های درهم‌سازی وابسته به حافظه (memory-hard) مانند yescrypt، این پارامتر همچنین مقدار حافظه مورد نیاز برای محاسبه یک هش را تنظیم می‌کند. قابلیت پیکربندی این مورد امکان‌پذیر می‌سازد که با بهبود سخت‌افزار، حملات حدس گذرواژه در برابر هش‌ها همچنان کُند و پرهزینه باقی بمانند. .Sh "قالب عبارت‌های عبور هش‌شده (FORMAT OF HASHED PASSPHRASES)" تمام روش‌های درهم‌سازی پشتیبانی‌شده توسط .Xr crypt 3 یک عبارت عبور هش‌شده تولید می‌کنند که از چهار مؤلفه تشکیل شده است: .Ar prefix , .Ar options , .Ar salt و .Ar hash . مؤلفه prefix مشخص می‌کند که کدام روش درهم‌سازی باید استفاده شود، و رشته مناسبی است که برای انتخاب آن روش به .Xr crypt_gensalt 3 داده می‌شود. محتوای .Ar options , .Ar salt و .Ar hash به روش بستگی دارد. بسته به روش، مؤلفه‌های .Ar prefix و .Ar options ممکن است خالی باشند. .Pp آرگومان .Fa setting در .Xr crypt 3 باید با سه مؤلفه اول یک عبارت عبور هش‌شده معتبر آغاز شود، اما هر چیزی پس از آن نادیده گرفته می‌شود. این امر احراز هویت را ساده می‌کند: عبارت‌عبور ورودی را با استفاده از عبارت‌عبور هش‌شدهٔ ذخیره‌شده به‌عنوان تنظیمات هش کرده، و سپس نتیجه را با عبارت‌عبور هش‌شدهٔ ذخیره‌شده مقایسه کنید. .Pp عبارت‌های عبور هش‌شده همیشه تماماً از نویسه‌های اسکی قابل‌چاپ تشکیل شده‌اند، و شامل هیچ فاصلهٔ خالی یا نویسه‌های .Sq Li \&: ، .Sq Li \&; ، .Sq Li \&* ، .Sq Li \&! ، یا .Sq Li \&\e نمی‌باشند. (این نویسه‌ها به‌عنوان جداکننده و نشانگرهای ویژه در پرونده‌های .Xr passwd 5 و .Xr shadow 5 استفاده می‌شوند.) .Pp نحو هر جزء از یک عبارت‌عبور هش‌شده به روش درهم‌سازی بستگی دارد. نویسه‌های .Sq Li \&$ معمولاً اجزا را از یکدیگر جدا می‌کنند، و سالت و هش معمولاً به‌صورت ارقام در مبنای ۶۴ کدگذاری می‌شوند. جزئیات این کدگذاری مبنای ۶۴ در میان روش‌های درهم‌سازی مختلف متفاوت است. کدگذاری رایج .Dq base64 مشخص‌شده توسط RFC 4648 معمولاً استفاده .Em نمی‌شود . .Sh "روش‌های درهم‌سازی موجود (AVAILABLE HASHING METHODS)" این فهرستی از .Em تمامی روش‌های درهم‌سازی پشتیبانی‌شده توسط .Xr crypt 3 است، که تقریباً به ترتیب نزولی قدرت مرتب شده‌اند. بسیاری از روش‌های قدیمی‌تر اکنون برای استفاده در عبارت‌های عبور جدید بسیار ضعیف در نظر گرفته می‌شوند. قالب عبارت‌عبور هش‌شده با عبارات منظم گسترده بیان می‌شود (نگاه کنید به .Xr regex 7 ) و تفکیک به پیشوند، گزینه‌ها، سالت و هش را نشان نمی‌دهد. .de hash .Bl -tag -width 2n .It Sy پیشوند .\" mandoc bug: .Qq comes out with curly quotes. .\" mandoc bug: .Li is hyperlinked to itself for no apparent reason. .Bf Li "\\$1" .Ef .if "\\$1"" (رشته خالی) .It Sy قالب عبارت‌عبور هش‌شده .\" mandoc bug: .Li is hyperlinked to itself for no apparent reason. .Bf -literal \&\\$2 .Ef .It Sy بیشینه طول عبارت‌عبور .ie "\\$3"unlimited" نامحدود .el \\$3 نویسه .if "\\$4"7" (بیت هشتم را نادیده می‌گیرد) .It Sy اندازه هش \\$6 بیت .if !"\\$5"\\$6" \{\ .It Sy اندازه کلید موثر \&\\$5 بیت .\} .It Sy اندازه سالت \\$7 بیت .It Sy پارامتر هزینه پردازش \\$8 .El .. .Ss yescrypt روش 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) منتشر شده است. برای هش‌های جدید توصیه می‌شود. .hash "$y$" "\e$y\e$[./A-Za-z0-9]+\e$[./A-Za-z0-9]{,86}\e$[./A-Za-z0-9]{43}" unlimited 8 256 256 "up to 512 (128+ recommended)" "1 to 11 (logarithmic, also affects memory usage)" .Ss gost-yescrypt روش gost-yescrypt از خروجی yescrypt به‌عنوان پیام ورودی برای HMAC همراه با تابع درهم‌سازی GOST R 34.11-2012 (Streebog) با خلاصه ۲۵۶ بیتی استفاده می‌کند. بدین ترتیب، ویژگی‌های رمزنگاری yescrypt جای خود را به ویژگی‌های تابع درهم‌سازی GOST می‌دهند. این روش درهم‌سازی در برنامه‌هایی کاربرد دارد که به درهم‌سازی مدرن عبارت‌عبور نیاز دارند، اما ناچار به اتکا بر الگوریتم‌های GOST هستند. تابع درهم‌سازی GOST R 34.11-2012 (Streebog) توسط IETF به‌عنوان RFC 6986 منتشر شده است. در صورت لزوم برای هش‌های جدید قابل قبول است. .hash "$gy$" "\e$gy\e$[./A-Za-z0-9]+\e$[./A-Za-z0-9]{,86}\e$[./A-Za-z0-9]{43}" unlimited 8 256 256 "up to 512 (128+ recommended)" "1 to 11 (logarithmic, also affects memory usage)" .Ss sm3-yescrypt روش sm3-yescrypt از خروجی yescrypt به‌عنوان پیام ورودی برای HMAC همراه با تابع درهم‌سازی ShangMi 3 با خلاصه ۲۵۶ بیتی استفاده می‌کند. بدین ترتیب، ویژگی‌های رمزنگاری yescrypt جای خود را به ویژگی‌های تابع درهم‌سازی ShangMi 3 می‌دهند. این روش درهم‌سازی در برنامه‌هایی کاربرد دارد که به درهم‌سازی مدرن عبارت‌عبور نیاز دارند، اما ناچار به اتکا بر الگوریتم‌های مورد تایید اداره رمزنگاری تجاری دولتی چین (OSCCA) هستند. اداره رمزنگاری تجاری دولتی (OSCCA). تابع درهم‌سازی ShangMi 3 در بخش ۳: "Dedicated hash-functions" از استاندارد ISO/IEC 10118-3:2018 منتشر شده است. در صورت نیاز برای هش‌های جدید قابل قبول است. .hash "$sm3y$" "\e$sm3y\e$[./A-Za-z0-9]+\e$[./A-Za-z0-9]{,86}\e$[./A-Za-z0-9]{43}" unlimited 8 256 256 "up to 512 (128+ recommended)" "1 to 11 (logarithmic, also affects memory usage)" .Ss scrypt روش scrypt یک تابع اشتقاق کلید مبتنی بر رمز عبور ایجادشده توسط Colin Percival است، که در اصل برای سرویس پشتیبان‌گیری برخط Tarsnap ساخته شد. این الگوریتم به‌طور ویژه طوری طراحی شده است که با نیازمندی به مقادیر زیادی حافظه، انجام حملات سخت‌افزاری سفارشی در مقیاس بزرگ را بسیار پرهزینه کند. در سال ۲۰۱۶، الگوریتم scrypt توسط IETF به‌عنوان RFC 7914 منتشر شد. .hash "$7$" "\e$7\e$[./A-Za-z0-9]{11,97}\e$[./A-Za-z0-9]{43}" unlimited 8 256 256 "up to 512 (128+ recommended)" "6 to 11 (logarithmic, also affects memory usage)" .Ss bcrypt یک هش مبتنی بر رمز قالبی Blowfish، که برای داشتن یک جدول زمان‌بندی کلید فوق‌العاده پرهزینه اصلاح شده است. در ابتدا توسط Niels Provos و David Mazieres برای OpenBSD توسعه یافت و همچنین در نسخه‌های اخیر FreeBSD و NetBSD، در Solaris 10 و جدیدتر، و در چندین توزیع گنو/لینوکس پشتیبانی می‌شود. .hash "$2b$" "\e$2[abxy]\e$[0-9]{2}\e$[./A-Za-z0-9]{53}" 72 8 184 184 128 "4 to 31 (logarithmic)" .Pp پیشوند جایگزین "$2y$" معادل "$2b$" است. این پیشوند تنها به دلایل تاریخی وجود دارد. پیشوندهای جایگزین "$2a$" و "$2x$" سازگاری با باگ‌های موجود در نسخه‌های 1.0.4 و قدیمی‌تر crypt_blowfish را فراهم می‌کنند، که نویسه‌های دارای بیت هشتم را به‌صورت نادرست پردازش می‌کردند. .Ss sha512crypt یک هش مبتنی بر SHA-2 با خروجی ۵۱۲ بیتی، که در ابتدا توسط Ulrich Drepper برای کتابخانه GNU libc توسعه یافت. در لینوکس پشتیبانی می‌شود اما در جاهای دیگر رایج نیست. برای هش‌های جدید قابل قبول است. پارامتر هزینه پردازش پیش‌فرض 5000 است، که برای سخت‌افزارهای امروزی بسیار پایین است. .hash "$6$" "\e$6\e$(rounds=[1-9][0-9]+\e$)?[^$:\(rsn]{1,16}\e$[./0-9A-Za-z]{86}" unlimited 8 512 512 "6 to 96" "1000 to 999,999,999" .Ss sha256crypt یک هش مبتنی بر SHA-2 با خروجی ۲۵۶ بیتی، که در ابتدا توسط Ulrich Drepper برای کتابخانه GNU libc توسعه یافت. در لینوکس پشتیبانی می‌شود اما در جاهای دیگر رایج نیست. برای هش‌های جدید قابل قبول است. پارامتر هزینه پردازش پیش‌فرض 5000 است، که برای سخت‌افزارهای امروزی بسیار پایین است. .hash "$5$" "\e$5\e$(rounds=[1-9][0-9]+\e$)?[^$:\(rsn]{1,16}\e$[./0-9A-Za-z]{43}" unlimited 8 256 256 "6 to 96" "1000 to 999,999,999" .Ss sm3crypt یک هش مبتنی بر تابع درهم‌سازی ShangMi 3 با خروجی ۲۵۶ بیتی، که از همان طراحی sha256crypt و/یا sha512crypt استفاده می‌کند. در توزیع‌های EulerOS، Kylin، openEuler و openKylin پشتیبانی می‌شود، اما در جاهای دیگر رایج نیست. در صورت نیاز برای هش‌های جدید قابل قبول است. پارامتر هزینه پردازش پیش‌فرض 5000 است، که برای سخت‌افزارهای امروزی بسیار پایین است. .hash "$sm3$" "\e$sm3\e$(rounds=[1-9][0-9]+\e$)?[^$:\(rsn]{1,16}\e$[./0-9A-Za-z]{86}" unlimited 8 256 256 "6 to 96" "1000 to 999,999,999" .Ss sha1crypt یک هش مبتنی بر HMAC-SHA1. در ابتدا توسط Simon Gerraty برای NetBSD توسعه یافت. نه به اندازه هش‌های مبتنی بر DES در زیر ضعیف است، اما SHA-1 در سخت‌افزارهای مدرن بسیار ارزان است به طوری که نباید برای هش‌های جدید استفاده شود. .hash "$sha1" "\e$sha1\e$[1-9][0-9]+\e$[./0-9A-Za-z]{1,64}\e$[./0-9A-Za-z]{8,64}[./0-9A-Za-z]{32}" unlimited 8 160 160 "6 to 384" "4 to 4,294,967,295" .Ss SunMD5 یک هش مبتنی بر الگوریتم MD5، که در ابتدا توسط Alec David Muffett برای Solaris توسعه یافت. تا جایی که می‌دانیم در جای دیگری به کار گرفته نشده است. نه به اندازه هش‌های مبتنی بر DES در زیر ضعیف است، اما MD5 در سخت‌افزارهای مدرن بسیار ارزان است به طوری که نباید برای هش‌های جدید استفاده شود. .hash "$md5" "\e$md5(,rounds=[1-9][0-9]+)?\e$[./0-9A-Za-z]{8}\e${1,2}[./0-9A-Za-z]{22}" unlimited 8 128 128 48 "4096 to 4,294,963,199" .Ss md5crypt یک هش مبتنی بر الگوریتم MD5، که در ابتدا توسط Poul-Henning Kamp برای FreeBSD توسعه یافت. در بیشتر سیستم‌های شبه‌یونیکس آزاد و نسخه‌های جدیدتر Solaris پشتیبانی می‌شود. نه به اندازه هش‌های مبتنی بر DES در زیر ضعیف است، اما MD5 در سخت‌افزارهای مدرن بسیار ارزان است به طوری که نباید برای هش‌های جدید استفاده شود. هزینه پردازش قابل تنظیم نیست. .hash "$1$" "\e$1\e$[^$:\(rsn]{1,8}\e$[./0-9A-Za-z]{22}" unlimited 8 128 128 "6 to 48" 1000 .Ss bsdicrypt (DES توسعه‌یافته BSDI) یک توسعه از DES سنتی، که محدودیت طول را حذف می‌کند، اندازه سالت را افزایش می‌دهد، و هزینه زمانی را قابل تنظیم می‌سازد. از BSDI BSD/OS سرچشمه می‌گیرد و به دلیل استفاده از کتابخانه FreeSec اثر David Burren دست‌کم در NetBSD، OpenBSD و FreeBSD نیز در دسترس است. بسیار بهتر از DES سنتی و bigcrypt است، اما همچنان نباید برای هش‌های جدید استفاده شود. .hash _ "_[./0-9A-Za-z]{19}" unlimited 7 "up to 56" 64 24 "1 to 16,777,215 (must be odd)" .Ss descrypt (DES سنتی) روش اصلی درهم‌سازی از Unix V7، مبتنی بر رمز قالبی DES. از آنجا که DES در سخت‌افزارهای مدرن ارزان است، و از آنجا که تنها ۴۰۹۶ سالت ممکن و ۲ به توان ۵۶ عبارت‌عبور متمایز وجود دارد، که آن را به ۸ نویسه کوتاه می‌کند، کشف .Em هر عبارت‌عبوری که با این روش هش شده باشد امکان‌پذیر است. تنها در صورتی باید استفاده شود که کاملاً مجبور به تولید هش‌هایی باشید که روی یک سیستم‌عامل قدیمی که از چیز دیگری پشتیبانی نمی‌کند کار کنند. .hash "" "[./0-9A-Za-z]{13}" 8 7 "up to 56" 64 12 25 .Ss bigcrypt یک توسعه ضعیف از DES سنتی، موجود در برخی از یونیکس‌های تجاری. تنها کاری که انجام می‌دهد این است که محدودیت طول را از ۸ به ۱۲۸ نویسه افزایش می‌دهد، و این کار را به روشی ابتدایی انجام می‌دهد که به مهاجمان اجازه می‌دهد بخش‌هایی از یک عبارت‌عبور طولانی را به‌صورت جداگانه و موازی حدس بزنند، که ممکن است حدس زدن را حتی از DES سنتی در بالا آسان‌تر کند. نباید برای هش‌های جدید استفاده شود. .hash "" "[./0-9A-Za-z]{13,178}" 128 7 "up to 56" "up to 1024" 12 25 .Ss NT روش درهم‌سازی استفاده‌شده برای احراز هویت شبکه در برخی از نسخه‌های پروتکل SMB/CIFS. به‌منظور سازگاری متقابل، در FreeBSD موجود است. مبتنی بر MD4. فاقد سالت یا پارامتر هزینهٔ قابل‌تنظیم است. آن‌قدر ضعیف است که تقریباً .Em هر عبارت‌عبور انتخاب‌شده توسط انسان که با این روش هش شود، قابل‌حدس است. تنها زمانی باید استفاده شود که قطعاً مجبور به تولید هش‌هایی باشید که روی یک سیستم‌عامل قدیمی که از چیز دیگری پشتیبانی نمی‌کند، کار کنند. .hash "$3$" "\e$3\e$\e$[0-9a-f]{32}" unlimited 8 256 256 0 1 .Sh "همچنین ببینید (SEE ALSO)" .Xr crypt 3 , .Xr crypt_gensalt 3 , .Xr getpwent 3 , .Xr passwd 5 , .Xr shadow 5 , .Xr pam 8 .Rs .%A Niels Provos .%A David Mazieres .%T A Future-Adaptable Password Scheme .%B Proceedings of the 1999 USENIX Annual Technical Conference .%D June 1999 .%U https://www.usenix.org/events/usenix99/provos.html .Re .Rs .%A Robert Morris .%A Ken Thompson .%T Password Security: A Case History .%J Communications of the ACM .%V 22 .%N 11 .%D 1979 .%U http://wolfram.schneider.org/bsd/7thEdManVol2/password/password.pdf .Re