سؤال: هل هذه الطريقة صحيحة في تشفير كلمة المرور في 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)


التعليق السابق

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

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 هنا ؟