English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
استخدام PHP function password_hash() و أمثلة
يستخدم function password_hash() لإنشاء مخضرة لكلمة المرور
النحو
string password_hash (string $password, int $algo[, array $options])
يستخدم password_hash() خوارزمية مُحالة ثنائية قوية لإنشاء مخضرة لكلمة المرور. يتوافق password_hash() مع crypt(). لذلك، يمكن استخدام مخضرة crypt() في password_hash().
الخوارزميات المدعومة حاليًا:
PASSWORD_DEFAULT
- استخدم خوارزمية bcrypt (الافتراضية في PHP 5.5.0).
ملاحظة، سيتم تغيير هذا المعرف مع إضافة PHP لخوارزميات أقوى.
لذا، فإن طول النتيجة التي يتم إنشاؤها باستخدام هذا المعرف سيختلف في المستقبل.
لذلك، يمكن أن تتجاوز أعمدة التخزين الناتجة في قاعدة البيانات 60 حرفًا (أفضل 255 حرفًا).
PASSWORD_BCRYPT - استخدم
CRYPT_BLOWFISH
سيتم إنشاء مخضرة باستخدام خوارزمية.
سيكون النتيجة قوة 60 حرفًا أو سيتم إرجاع قيمة فاشلة عند الفشل FALSE
.
PASSWORD_ARGON2I
- إنشاء مخضرة باستخدام خوارزمية Argon2.
الخيارات المدعومة من PASSWORD_BCRYPT:
salt(string) - تقديم ملح (salt) للكلمة المرور المُخضرة يدويًا. هذا سيفضل عدم إنشاء ملح تلقائيًا.
إذا تم التغاضي عن هذه القيمة، سيقوم password_hash() بإنشاء ملح عشوائي تلقائيًا لكل كلمة المرور المُخضرة. هذه هي ممارسة مقصودة.
ملاحظة: تم إلغاء خيار salt (الملح) من PHP 7.0.0. يُفضل الآن اختيار استخدام الملح المُنتج بشكل افتراضي.
cost (integer) - يمثل تكلفة استخدام الخوارزمية. هناك أمثلة على قيمة cost في صفحة crypt().
إذا تم التغاضي عنها، فإن القيمة الافتراضية هي 10. هذا التكلفة هو خط أساسي جيد، ولكن قد يكون من الممكن زيادة هذه القيمة بناءً على حالة هاردويرك.
الخيارات المدعومة من PASSWORD_ARGON2I:
memory_cost (integer) - ذاكرة الوصول العشوائي الأكبر التي يمكن استخدامها لتحليل مشفر Argon2 (بونيتات: بايت byte). القيمة الافتراضية: PASSWORD_ARGON2_DEFAULT_MEMORY_COST
.
time_cost (integer) - الوقت الأقصى الذي يمكن استخدامها لتحليل مشفر Argon2. القيمة الافتراضية: PASSWORD_ARGON2_DEFAULT_TIME_COST
.
threads (integer) - عدد الأنماط التي يمكن استخدامها لتحليل مشفر Argon2. القيمة الافتراضية: PASSWORD_ARGON2_DEFAULT_THREADS
.
شرح المعلمات:
password: قيمة مشفرة كلمة المرور التي أنشأها password_hash().
algo: مصفوفة مرتبطة تستخدم لتعيين خوارزمية التشفير عند تشفير كلمة المرور.
options: مصفوفة مرتبطة تحتوي على الخيارات. حاليًا يدعمان خيارين: salt، الملح المضاف أثناء تشفير كلمة المرور (نص مزعج)، وcost، يحدد عدد الأ层数 التي تشفى خوارزمية التشفير. يمكن العثور على أمثلة لهذه القيم في صفحة crypt().
إذا تم حذفها، سيتم استخدام الملح العشوائي والcost الافتراضية.
تسليم كلمة المرور المشفرة أو FALSE إذا فشل ذلك.
<?php /** * نريد استخدام خوارزمية التخزين الافتراضية * حاليًا هي BCRYPT، وستنتج 60 حرفًا. * * انتبه، قد تتغير الخوارزمية الافتراضية مع مرور الوقت، * لذا يجب أن تكون المساحة المخزنة أكبر من 60 حرفًا (255 حرف جيد) */ echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT); ?>
نتيجة الخروج هي:
$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a
<?php /** * في هذا المثال، نرفع cost إلى 12 لـ BCRYPT. * انتبه، لقد انتقلنا إلى، سيكون دائمًا 60 حرفًا. */ $options = [ 'cost' => 12, echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options); ?>
نتيجة الخروج هي:
$2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDxY3K
مثال على تعيين الملح يدويًا
<?php /** * انتبه، القيمة العشوائية هنا. * لا تستخدم أبدًا قيمة ملح ثابتة أو غير معينة بشكل عشوائي. * * في معظم الحالات، يمكن استخدام password_hash لإنشاء قيمة الملح العشوائية تلقائيًا */ $options = [ 'cost' => 11, 'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM), echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options); ?>
نتيجة الخروج هي:
$2y$11$q5MkhSBtlsJcNEVsYh64a.aCluzHnGog7TQAKVmQwO9C8xb.t89F.
البحث عن أفضل cost لـ password_hash() مثال
<?php /** * هذا المثال قام باختبار الأساس (benchmark) للخادم لتحديد ما هو أعلى تكلفة يمكن للخادم تحملها * يمكن تعيين أكبر قيمة ممكنة دون إبطاء الخادم بشكل واضح * 8-10 هي نقطة انطلاق جيدة، في حالة سرعة الخادم الكافية، كلما كان أعلى، كلما كان أفضل * رمز الهدف هو ≤ 50 ميللي ثانية (milliseconds) * مناسبة تكلفة العثور على نظام معالجة التفاعل */ $timeTarget = 0.05; // 50 ميللي ثانية (milliseconds) $cost = 8; do { $cost++; $start = microtime(true); password_hash("test", PASSWORD_BCRYPT, ["cost" => $cost]); $end = microtime(true); } while (($end - $start) < $timeTarget); echo "Appropriate Cost Found: " . $cost; ?>
نتيجة الخروج هي:
Appropriate Cost Found: 10
استخدام نموذج Argon2:
<?php echo 'Argon2 hash: ' . password_hash('rasmuslerdorf', PASSWORD_ARGON2I); ?>
نتيجة الخروج هي:
Argon2 hash: $argon2i$v=19$m=1024,t=2,p=2$YzJBSzV4TUhkMzc3d3laeg$zqU/1IN0/AogfP4cmSJI1vc8lpXRW9/S0sYY2i2jHT0