ویژگی تصویر

تابع sha1() در PHP

  /  PHP   /  تابع sha1() در PHP
بنر تبلیغاتی الف
آموزش PHP

تابع sha1() در PHP یک تابع آماده برای محاسبه مقدار هش SHA-1 از یک رشته است. این تابع مقدار 40 کاراکتری هگزادسیمال (160 بیت) تولید می‌کند و برای مقاصدی مانند بررسی یکپارچگی داده، تولید شناسه‌های کوتاه یا مقایسه محتوا استفاده می‌شود. با این‌حال در زمینه‌های حساس امنیتی باید با احتیاط و به‌جای مناسب از آن استفاده کرد.

نحو و خروجی تابع

نحو پایه‌ی تابع به شکل زیر است:

string sha1 ( string $str [, bool $raw_output = false ] )

اگر پارامتر دوم نرمال (یا حذف‌شده) باشد، خروجی یک رشته هگز با 40 کاراکتر است. اگر raw_output=true شود، تابع همان 20 بایت باینری را بازمی‌گرداند.

مثال ساده

<?php
$input = "hello world";
$hash = sha1($input);
echo $hash; // 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed
?>

در این مثال، sha1 یک رشته هگزادسیمال 40 حرفی برمی‌گرداند که نماینده‌ی 160 بیت هش است. این مقدار برای مقایسه سریع محتوا یا کنترل یکپارچگی مناسب است.

خروجی باینری و تبدیل آن

<?php
$raw = sha1("data", true); // خروجی باینری 20 بایتی
$hex = bin2hex($raw); // تبدیل به رشته هگز معادل
?>

استفاده از raw_output زمانی مفید است که می‌خواهیم حجم حافظه یا پهنای باند را کاهش دهیم یا هش را به‌صورت باینری در پایگاه داده ذخیره کنیم. برای نمایش به‌صورت خوانا، معمولاً از bin2hex استفاده می‌شود.

محاسبه هش فایل

<?php
$fileHash = sha1_file('/path/to/file.zip');
echo $fileHash;
?>

sha1_file تابعی آسان برای محاسبهٔ هش فایل‌ها است. مناسب برای بررسی یکپارچگی فایل‌های دانلودی یا ذخیره‌شده. توجه داشته باشید که برای فایل‌های خیلی بزرگ باید محدودیت‌های حافظه/IO را در نظر بگیرید.

موارد استفاده و کاربردهای معمول

  • تولید چک‌سام (checksum) برای بررسی تغییرات فایل‌ها یا دیتا.
  • تولید شناسه‌های نسبتا یکتا مثل cache keys، ETagها یا short IDs.
  • کنترل یکپارچگی داده‌ها در انتقال یا ذخیره‌سازی.
  • در برخی سیستم‌ها برای پیاده‌سازی HMAC با hash_hmac(‘sha1’, …).

نمونه: استفاده از SHA-1 در HMAC

<?php
$message = "important message";
$key = "secret-key";
$hmac = hash_hmac('sha1', $message, $key);
echo $hmac;
?>

در اینجا از تابع hash_hmac با الگوریتم ‘sha1’ استفاده شده است که برای احراز هویت پیام (MAC) مناسب‌تر از بدون کلید بودن SHA-1 است. HMAC با کلید مناسب هنوز در برخی موارد امن‌تر از استفادهٔ صرف SHA-1 در زمینه‌های احراز هویت است.

ملاحظات امنیتی و توصیه‌های کارشناسی

در دهه‌های اخیر حملاتی روی SHA-1 پیدا شد که نشان داد این الگوریتم دیگر به‌عنوان یک تابع هش مقاوم در برابر برخوردها (collision-resistant) امن محسوب نمی‌شود. به‌خصوص پس از اعلام موفقیت‌آمیز تولید برخورد کنترل‌شده (collision) در 2017، استفاده از SHA-1 در کاربردهای حساس مثل امضاها، گواهی‌های دیجیتال یا ذخیره گذرواژه‌ها نامطلوب است.

  • ذخیره کردن گذرواژه‌ها: هرگز برای ذخیرهٔ رمز عبور از sha1 یا md5 استفاده نکنید. به‌جای آن از password_hash() و password_verify() استفاده کنید.
  • یکپارچگی عمومی: برای چک‌سام‌ها و موارد غیرانتقادی می‌توانید از SHA-1 استفاده کنید اما بهتر است SHA-256 یا SHA-3 را ترجیح دهید.
  • نیاز به احراز هویت پیام: از HMAC با SHA-256 یا الگوریتم‌های قوی‌تر استفاده کنید.

جایگزین‌های پیشنهادی

هدفتوابع پیشنهادی در PHPدلیل
ذخیره گذرواژهpassword_hash(), password_verify()استفاده از bcrypt/argon2 و نمک‌گذاری خودکار
هش عمومی / چک‌سامhash(‘sha256’, …)مقاومت بالاتر در برابر برخورد
HMAChash_hmac(‘sha256’, …)امنیت بیشتر نسبت به SHA-1

نکات عملکردی و فنی

  • SHA-1 نسبت به SHA-256 سریع‌تر است اما اختلاف عمده‌ای در اکثر کاربردها وجود ندارد مگر در نیازهای بسیار حساس به تأخیر.
  • خروجی sha1 به‌صورت رشته هگز است؛ برای ذخیرهٔ فشرده‌تر می‌توان خروجی باینری را مستقیم ذخیره کرد.
  • در مقایسه‌ها از توابع زمان‌بندی-ثابت (constant-time) برای جلوگیری از حملات زمان‌سنجی استفاده کنید؛ برای مثال هنگام مقایسه HMAC از hash_equals() بهره ببرید.

مثال: مقایسه امن دو هش

<?php
$hash1 = sha1($data1);
$hash2 = sha1($data2);
// مقایسه امن (اجتناب از == یا === جهت جلوگیری از حملات زمان‌سنجی)
if (hash_equals($hash1, $hash2)) {
    echo "match";
} else {
    echo "not match";
}
?>

استفاده از hash_equals از طریق مقایسه زمان‌بندی ثابت از افشای اطلاعات حساس از طریق تحلیل زمان جلوگیری می‌کند.

خلاصه و توصیه نهایی

تابع sha1() در PHP ابزاری ساده و سریع برای محاسبه‌ی هش SHA-1 است و برای مواردی مثل بررسی یکپارچگی ساده، تولید شناسه‌های نه‌چندان حساس و برخی کاربردهای سازگاری مناسب است. اما برای کاربردهای امنیتی حساس مانند ذخیره‌ی گذرواژه‌ها، امضای دیجیتال یا هر جایی که مقاومت در برابر برخورد اهمیت دارد، از الگوریتم‌های قوی‌تر (SHA-256/ SHA-3)، HMAC مناسب یا APIهای اختصاصی مانند password_hash استفاده کنید.

در صورت نیاز به نمونه‌های خاص‌تر یا مهاجرت از SHA-1 به الگوریتم‌های جدیدتر، می‌توان راهنمای گام‌به‌گام و نمونه‌کدهای تبدیل را ارائه داد.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: