سؤال: هل هذه الطريقة صحيحة في تشفير كلمة المرور في mysql و php ؟

السلام عليكم

أريد أن أعرف هل هذه الطريقة التي أستخدم صحيحة وليس فيها مخاطر أمنية

الطريقة كالتالي في نظام تسجيل حساب جديد أو تسجيل دخول

1- أنشأت جدول في قاعدة البيانات بهذه الطريقة

CREATE TABLE `users` (
    `id` INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `username` VARCHAR(30) NOT NULL,
    `password` VARCHAR(41) NOT NULL,
    `fullname` VARCHAR(30) NOT NULL,
    `date` DATE NOT NULL,
    UNIQUE (`username`)
) ENGINE = MYISAM ;

2- لإنشاء حساب جديد أستخدم sql بهذه الطريقة

INSERT INTO `users` (`username`, `password`,  `date`)
VALUES ('test', PASSWORD('test'), NOW())

3- لتسجيل الدخول أستخدم هذه الطريقة

SELECT `id`, `fullname`, `date`
FROM `users`
WHERE `username` = '$username' AND `password` = PASSWORD('$password')
LIMIT 0, 2

سؤالي هو هل استخدامي لدالة PASSWORD في sql صحيح وليس فيه مخاطر أمنية ؟

وإذا كان صحيحا كم عدد الخانات الذي يجب إعطاؤه لناتج الدالة PASSWORD ؟ (أعطيته 41)


استخدم طريقة الـ Salt في تستجيل الدخول

مثال بسيط بالـ PHP

$salt = rand(30);
$password = md5(md5(password).md5($salt));

`INSERT INTO USERS (id,username,password,salt) VALUES ('id here','username here','$password','$salt')`

هل salt$ يجب أن يبقى رقما تابثا ؟

إذا كان نعم، لماذا أدخلت salt$ في في الجدول ؟

إذا كان لا، كيف ستكون عملية تسجيل الدخول ؟

رقم عشوائي يخزن في قاعدة البيانات

لتسجيل الدخول اجلب الـ Salt من قاعدة البيانات وادمجة مع كلمة السر التالي ادخلها المستخدم

وتحقق هل هي نفس كلمة السر ام لا

if($passwordFromDatabase == md5(md5(passwordFromUSER).md5($saltFromDatabase)))

هل الدالة md5 تعيد نفس عدد الخانات مهما اختلفت المدخلات ؟

مثلا

md5("zrezf")     = c03e931121b6c1b5325ca06d2dfa03a6
md5("abcdfqsdf") = 63d24b2159f182404af40de547c2f7a7

عدد الخانات هو 32

هل أجعل في قاعدة البيانات العمود password يحمل 32 فقط ؟

وجزاك الله خيرا :)

The hash is always 128 bits. If you encode it as a hexdecimal string you can encode 4 bits per character, giving 32 characters.

أيضاً هذا الكود ليس آمناً.

1) الدالة rand هي PRNG وهي تولد اعداد عشوائية قابلة للتوقع، الأفضل استخدام دالة تولد أعداد عشوائية أمنة غير قابلة للتوقع لل Salt.

2) الدالة MD5 هي دالة Hashing ولكنها ضعيفه Broken Hashing Method وبها تصادمات كثيرة.

3) الHashing مع ال salt غير مناسبتان لحفظ كلمات المرور لأنها دوال سريعة في الحساب ويستطيع المخترق عمل brute force لملايين الكلمات في ثانية او اقل حتى.

الذي يفترض ان تستخدم دالة مشابه لل Hashing + Salt ولكن تكون بطئية بمقدار 1 ثانية مثلاً حتى تبطئ عمليات كسر الباسوردات. فبدلاً من حساب 10 مليون كلمة في الثانية، سوف تجعله يحسب 1 كلمة في الثانية والفرق كبير جداً.

لذللك استخدم اي من هذه الدوال المصممة لذلك، مثلاً PBKDF2, bcrypt, and scrypt وهي افضل بكثير.

قم بتطبيق هذه الخيارات على حسب اللغة التي تستخدمها سوف تجد الحل المناسب:

1- هل هذا حل جيد لدالة rand ؟

$salt = rand(1, 9);
for ($i = 1; $i < 32; $i++) {$salt .= rand(0,9); }

// $salt = 49390927647528472350648983518640

2- هل أعوض دالة md5 بدالة password_hash ؟

3- هل ينفع استخدام usleep هنا ؟

سؤال اضافي إذا استعملت طريقتك، ما هي الطريقة الصحيحة -لطلبها- قاعدة البيانات !

عندما يرغب المستخدم بتسجيل الدخول كيف ستأكد من أن

  $password-intserted == $his-salted-pass

هكذا

if($passwordFromDatabase == md5(md5(passwordFromUSER).md5($saltFromDatabase)))

صديقي ، أشكرك لقد استخدمت هذه الطريقة ، حاولت كسرها لكنني لم أستطع ، هل قمت بمحاولت ذلك أنت ايضا ! هل تعتقد أنها آمنة كفاية