توابع crypt() در PHP

تعریف و استفاده

توابع crypt() رشته‌ای را که با الگوریتم‌های DES، Blowfish یا MD5 رمزنگاری شده است، بازمی‌گرداند.

رفتار این تابع در سیستم‌عامل‌های مختلف متفاوت است، برخی از سیستم‌عامل‌ها از یک یا چند نوع الگوریتم پشتیبانی می‌کنند. در زمان نصب، PHP بررسی می‌کند که چه الگوریتم‌هایی در دسترس هستند و از چه الگوریتمی استفاده می‌کند.

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

در اینجا چندین عدد ثابت وجود دارد که با تابع crypt() استفاده می‌شوند. مقادیر این اعداد ثابت در زمان نصب توسط PHP تنظیم می‌شوند.

اعداد ثابت:

[CRYPT_SALT_LENGTH] طول رمزنگاری پیش‌فرض. از رمزنگاری استاندارد DES استفاده می‌کند، طول 2 بایت
[CRYPT_STD_DES] هش‌بندی بر اساس الگوریتم DES استاندارد از دو کاراکتر از حروف "./0-9A-Za-z" به عنوان نمک استفاده می‌کند. استفاده از کاراکترهای غیرقانونی در نمک منجر به شکست crypt() می‌شود.
[CRYPT_EXT_DES] هش‌بندی بر اساس الگوریتم DES گسترده. مقدار نمک یک رشته 9 کاراکتری است که از یک زیرخط پس از 4 بایت تکرار و 4 بایت نمک تشکیل شده است. آنها به صورت قابل چاپ کدگذاری می‌شوند، هر کاراکتر 6 بیت و اولویت به کاراکترهای کمترین بیت داده می‌شود. 0 تا 63 به صورت "./0-9A-Za-z" کدگذاری می‌شوند. استفاده از کاراکترهای غیرقانونی در نمک منجر به شکست crypt() می‌شود.
[CRYPT_MD5] هش MD5 از یک رشته‌ی 12 حرفی با شروع $1$ استفاده می‌کند.
[CRYPT_BLOWFISH] الگوریتم Blowfish از نمک زیر استفاده می‌کند: "$2a$"، یک پارامتر cost دو رقمی، "$" و یک رشته‌ی 64 حرفی که از کاراکترهای "./0-9A-Za-z" ترکیب شده است. استفاده از کاراکترهای خارج از این محدوده در نمک باعث می‌شود که crypt() یک رشته‌ی خالی بازگرداند. پارامتر cost دو رقمی یک logarithm با پایه‌ی 2 از تعداد تکرارهاست، که در محدوده‌ی 04-31 قرار دارد. خارج شدن از این محدوده باعث شکست crypt() می‌شود.
CRYPT_SHA256 الگوریتم SHA-256 از یک رشته‌ی 16 حرفی با شروع $5$ برای هش استفاده می‌کند. اگر رشته‌ی نمک با "rounds=<N>$" شروع شود، مقدار عددی N برای تعیین تعداد دفعات تکرار هش استفاده می‌شود، که شبیه به پارامتر cost الگوریتم Blowfish است. تعداد تکرارهای پیش‌فرض 5000 است، کمترین تعداد 1000 و بیشترین تعداد 999,999,999. تعداد N خارج از این محدوده به مقدار نزدیک‌تر تبدیل می‌شود.
CRYPT_SHA512 الگوریتم SHA-512 از یک رشته‌ی 16 حرفی با شروع $6$ برای هش استفاده می‌کند. اگر رشته‌ی نمک با "rounds=<N>$" شروع شود، مقدار عددی N برای تعیین تعداد دفعات تکرار هش استفاده می‌شود، که شبیه به پارامتر cost الگوریتم Blowfish است. تعداد تکرارهای پیش‌فرض 5000 است، کمترین تعداد 1000 و بیشترین تعداد 999,999,999. تعداد N خارج از این محدوده به مقدار نزدیک‌تر تبدیل می‌شود.

در سیستم‌هایی که از چندین الگوریتم پشتیبانی می‌کنند، اگر از این متغیرهای ثابت پشتیبانی می‌شود، آن‌ها را به مقدار "1" تنظیم کنید، در غیر این صورت به مقدار "0".

نکات:هیچ تابع رمزگشایی معادل وجود ندارد. تابع crypt() از یک الگوریتم یک‌طرفه استفاده می‌کند.

جملات‌نویسی

crypt(str,نمک)
پارامترها توضیح
str ضروری. رشته‌ای که باید رمزگذاری شود را تعیین می‌کند.
نمک اختیاری. برای افزایش تعداد کاراکترهای رمزگذاری‌شده استفاده می‌شود تا رمزگذاری امن‌تر شود. اگر پارامتر نمک ارائه نشده باشد، در هر بار که این تابع فراخوانی می‌شود، PHP یک نمک تصادفی تولید می‌کند.

جزئیات فنی

مقدار بازگشتی: رشته‌ی رمزگذاری‌شده را بازمی‌گرداند یا یک رشته‌ی کمتر از 13 حرف، تا در صورت شکست با نمک تفاوت داشته باشد.
نسخه‌ی PHP: 4+

گزارش به‌روزرسانی

نسخه توضیحات
5.3.2 بر اساس پیاده‌سازی Ulrich Drepper، crypt برای الگوریتم‌های SHA-256 و SHA-512 اضافه شد.
5.3.2 مشکلی که در الگوریتم Blowfish به دلیل چرخه‌های غیرقانونی رخ می‌داد را رفع کرد، به جای استفاده از الگوریتم DES به دنبال بازگشت عبارت "ناکام" ("*0" یا "*1") بود.
5.3.0 PHP اکنون شامل پیاده‌سازی خود از MD5 Crypt می‌شود، از جمله الگوریتم‌های استاندارد DES، الگوریتم‌های توسعه‌یافته DES و الگوریتم Blowfish. اگر سیستم پیاده‌سازی مناسب را ندارد، PHP از پیاده‌سازی خود استفاده خواهد کرد.

مثال

مثال 1

در این مثال، ما از الگوریتم‌های مختلف آزمایش خواهیم کرد:

<?php
// salt دو کاراکتری
if (CRYPT_STD_DES == 1)
{
echo ".Standard DES: ".crypt('something','st')."\n<br>";
}
else
{
echo ".Standard DES نه پشتیبانی می‌شود.\n<br>";
}
// salt 4 کاراکتری
if (CRYPT_EXT_DES == 1)
{
echo ".Extended DES: ".crypt('something','_S4..some')."\n<br>";
}
else
{
echo ".Extended DES نه پشتیبانی می‌شود.\n<br>";
}
// با $1 شروع می‌شود 12 کاراکتر
if (CRYPT_MD5 == 1)
{
echo ".MD5: ".crypt('something','$1$somethin$')."\n<br>";
}
else
{
echo ".MD5 نه پشتیبانی می‌شود.\n<br>";
}
// Salt با $2a شروع می‌شود. پارامتر cost دو رقمی: 09. 22 کاراکتر
if (CRYPT_BLOWFISH == 1)
{
echo ".Blowfish: ".crypt('something','$2a$09$anexamplestringforsalt$')."\n<br>";
}
else
{
echo ".Blowfish DES نه پشتیبانی می‌شود.\n<br>";
}
// The 16-character salt starts with $5$. The default number of rounds is 5000.
if (CRYPT_SHA256 == 1)
{
echo ".SHA-256: ".crypt('something','$5$rounds=5000$anexamplestringforsalt$')."\n<br>";
else
{
echo "SHA-256 not supported.\n<br>";
}
// The 16-character salt starts with $5$. The default number of rounds is 5000.
if (CRYPT_SHA512 == 1)
{
echo "SHA-512: ".crypt('something','$6$rounds=5000$anexamplestringforsalt$');
}
else
{
echo "SHA-512 not supported.";
}
?>

The output of the above code (depending on the operating system):

Standard DES: stqAdD7zlbByI
Extended DES: _S4..someQXidlBpTUu6
MD5: $1$somethin$4NZKrUlY6r7K7.rdEOZ0w.
Blowfish: $2a$09$anexamplestringforsaleLouKejcjRlExmf1671qw3Khl49R3dfu
SHA-256: $5$rounds=5000$anexamplestringf$KIrctqsxo2wrPg5Ag/hs4jTi4PmoNKQUGWFXlVy9vu9
SHA-512: $6$rounds=5000$anexamplestringf$Oo0skOAdUFXkQxJpwzO05wgRHG0dhuaPBaOU/
oNbGpCEKlf/7oVM5wn6AN0w2vwUgA0O24oLzGQpp1XKI6LLQ0.