Midget1337
20-03-2013, 10:52 AM
بسم الله الرحمن الرحيم
طبعا كلنا عارفين ان مفيش حاجة آمنة 100% و أي حاجة عرضة للسرقة بس احنا بنعمل الأسباب و بنحاول اننا نمنع السرقة أو نصعبها.:jason2:
في نهاية الموضوع ده هنخلي الـ Password System بتاعك معقد أكتر من النظام الحالي بحيث ان لاقدر الله لو حد سرق الداتابيز بتاعتك مش هيقدر يطلع أي بيانات لأي أكونت ..يعني لو ما عملش بيها سيرفر هيبلها و يشرب ميتها.
الصورة النهائية للي هنعملو :
http://img713.imageshack.us/img713/2319/passwordsystem1.jpg
ملاحظة مهمة جدا : لازم تاخد نسخ احتياطية من الـ SRO_VT_ACCOUNT وملفات الموقع www
أولا: لازم نعرف ايه اللي بيحصل لما تكتب الباسوورد و تيجي تخش الجيم..
انتا بتكتب الباسوورد عادي جدا..الـ GatewayServer بيحولها لـ MD5 Hash ( و دا نوع من أنواع التشفير) عشان يطابقها بالموجودة في الداتابيز ..لو مضبوطة يبقى المستخدم يخش..لو غلط يقولو غلط.
عشان كده في خطوات عمل السيرفر بيقولك انك تكتب الباسوورد و تحطها في الموقع دا www.md5.net (http://www.md5.net) و هيطلعلك Hash و هوا دا اللي تحطو في TB_User في الداتابيز..
---
ثانيا: لا قدر الله لو الداتابيز بتاعتك اتسرقت.. اللي أخدها بيعمل ايه؟ :twisted:
بالنسبة للـ Account Database مش هتفيده غير TB_User ..
ببساطة هيخش على موقع زي دا : MD5Decrypter.co.uk (http://www.md5decrypter.co.uk/) و هتدخل الهاش اللي عندك و تعمله Decrypt زي الصورة كده :
http://img194.imageshack.us/img194/5678/passwordsystem2.jpg
طبعا دي طريقة من الطرق اللي ممكن تفك بيها الـ MD5 ..القصد ان الـ MD5 دي ضعيفة جدا و ممكن أي حد يفكها.
---
ثالثا: ايه نظام التشفير الجديد اللي هيتم في الموضوع ده؟
ببساطة هنشفر الباسوورد مرة تاني بحيث ان لو حد قدر يفك تشفير الباسوورد (و دا صعب جدا) هتطلعلو md5 hash ..يعني مش هتفيدو بحاجة و لازم يفك تشفير الـ MD5 عشان يعرف الباسوورد.
نظام التشفير اللي هنعملوا اسمه SHA1 و دا أقوى من الـ MD5 بس زي ما قولت هيبقى فيه تشفير ثنائي..يعني كأنك عامل باسوورد من 30 حرف و رقم زي كده : d6df873a6b1bc0043cc0cec9d4aabeda و مشفرها بالـ SHA1
---
رابعا : نبدأ الشرح :
الحاجات اللي هنغيرها :
-SQL Stored procedures
-SQL TB_User design
-PHP code
الـ Stored procedures اللي مسؤولة عن الحوار ده اتنين :
CertifyUser_ : خاصة بالـ SMC Login
CertifyTB_User_ :خاصة بالـ Ingame Login
ببساطة هنخش على CertifyUser_ و ندور على الحقول الخاص بالباسوورد :
هنلاقيه انه szPassword@
هنضيف متغير جديد و نسميه encpassword@ زي الصورة كده :
http://img705.imageshack.us/img705/7549/passwordsystem3.jpg
دلوقتي عشان نخلي الـ SMC يقرا المتغير الجديد ..ننزل تحت شوية و هنلاقي السطر دا : if (not exists(select JID from TB_User where JID = @nUserJID and password = @szPassword))نغير szPassword@ الى encpassword@ و ندوس Execute
http://img404.imageshack.us/img404/8656/passwordsystem4.jpg
و هنعمل نفس الحكاية في CertifyTB_User_ زي الصورة كدا :
http://img11.imageshack.us/img11/347/passwordsystem6.jpg
و تدوس Execute
كده خلصنا الجزء الأول
تاني حاجة هنخلي الـ TB_User يقرا الـ Binary data اللي هتبقا الباسووردات متخزنة على شكلها
أول حاجة لازم نعدل على حاجة في الـ Tools ->Options
نشيل علامة الصح من Prevent saving changes that require table re-creation
http://img195.imageshack.us/img195/1838/passwordsystem5.jpg
نيجي بعدين للـ TB_User
ندوس right click و نختار Design
هيطلع المربع دا ..نختار Password و نغيرها من varchar لـ (varbinary(20 و ندوس Save
http://img820.imageshack.us/img820/7435/passwordsystem7.jpg
كده خلصنا الجزء التاني
نيجي لجزء الـ PHP
الجزء دا مهم عشان اللي بيعمل أكونت أو بيغير الباسوورد أو بيخش عالموقع بالأكونت بتاعو
كل موقع و حسب الملفات بتاعتو بس كلهم في الاخر بيعملو Query للتعديل على TB_User
ف انتا تدور عندك في ملفات الـ Classes/Inlcudes/Register الخ على الـ Query دا
بالنسبة للـ Register هيبقى زي كدا :
$this->con->sql = "INSERT INTO dbo.TB_User (StrUserID, password, Email, reg_ip) VALUES ('$this->username', '$this->password', '$this->Email', '$ip');";هنغيره لـ
$this->con->sql = "INSERT INTO dbo.TB_User (StrUserID, password, Email, reg_ip) VALUES ('$this->username', (CONVERT(varbinary(max), (select hashbytes('sha1','$this->password')) , 2)), '$this->Email', '$ip');";باضافة الجزء الأحمر..و هكذا في الـ Scripts الخاصة بـ Password change/Login
ببساطة تغير 'this->password$' أو غيره (حسب اسم المتغير اللي المبرمج عاملو) الى
(CONVERT(varbinary(max), (select hashbytes('sha1','$this->password')) , 2))
---
خامسا: ازاي تغير باسوورد عن طريق الـ SQL ؟
أولا تخش عادي عالموقع دا www.md5.net و تكتب الباسوورد اللي انتا عايزها و تجيب الهاش بتاعها و لنفترض 123456
هيطلع الهاش دا :e10adc3949ba59abbe56e057f20f883e
و عن طريق كويري زي كده :
update TB_User
set password= (CONVERT(varbinary(max), (select hashbytes('sha1','e10adc3949ba59abbe56e057f20f883e ')) , 2))
where StrUserID='MyAccountID'
بس كده.. :thumb_yello:
---
سادسا : بالنسبة لأصحاب السيرفرات اللي عندهم أكونتات و عايزين يعملوا الموضوع دا عندهم :
أولا هتاخد backup من الداتابيز و ملفات الموقع
بعدين تعمل الكويري دا :
update TB_User
set password= (CONVERT(varbinary(max), (select hashbytes('sha1',password)) , 2))
بعديها تبدأ تعمل الخطوات اللي فوق زي ما هيا كده
---
سابعا: كام ملاحظة كده :
-الموضوع دا مش منقول من أي مكان..و لو في يوم من الأيام حد لقيه في موقع عربي أو أجنبي يبقى منقول من هنا.
-اللي عايز ينقله ينقله بشرط ذكر المصدر.
-الموضوع دا مجرب و شغال 100% و سيرفر Perfection شغال بيه حاليا.
-لو حد عنده أي استفسار أو مشكلة بخصوص الموضوع دا يسأل في الردود و أنا مش هتأخر عليه.
-أتقدم بالشكر لـ Sebastian عشان هوا اللي ساعدني في الحوار دا. :hypocrite1:
في أمان الله
طبعا كلنا عارفين ان مفيش حاجة آمنة 100% و أي حاجة عرضة للسرقة بس احنا بنعمل الأسباب و بنحاول اننا نمنع السرقة أو نصعبها.:jason2:
في نهاية الموضوع ده هنخلي الـ Password System بتاعك معقد أكتر من النظام الحالي بحيث ان لاقدر الله لو حد سرق الداتابيز بتاعتك مش هيقدر يطلع أي بيانات لأي أكونت ..يعني لو ما عملش بيها سيرفر هيبلها و يشرب ميتها.
الصورة النهائية للي هنعملو :
http://img713.imageshack.us/img713/2319/passwordsystem1.jpg
ملاحظة مهمة جدا : لازم تاخد نسخ احتياطية من الـ SRO_VT_ACCOUNT وملفات الموقع www
أولا: لازم نعرف ايه اللي بيحصل لما تكتب الباسوورد و تيجي تخش الجيم..
انتا بتكتب الباسوورد عادي جدا..الـ GatewayServer بيحولها لـ MD5 Hash ( و دا نوع من أنواع التشفير) عشان يطابقها بالموجودة في الداتابيز ..لو مضبوطة يبقى المستخدم يخش..لو غلط يقولو غلط.
عشان كده في خطوات عمل السيرفر بيقولك انك تكتب الباسوورد و تحطها في الموقع دا www.md5.net (http://www.md5.net) و هيطلعلك Hash و هوا دا اللي تحطو في TB_User في الداتابيز..
---
ثانيا: لا قدر الله لو الداتابيز بتاعتك اتسرقت.. اللي أخدها بيعمل ايه؟ :twisted:
بالنسبة للـ Account Database مش هتفيده غير TB_User ..
ببساطة هيخش على موقع زي دا : MD5Decrypter.co.uk (http://www.md5decrypter.co.uk/) و هتدخل الهاش اللي عندك و تعمله Decrypt زي الصورة كده :
http://img194.imageshack.us/img194/5678/passwordsystem2.jpg
طبعا دي طريقة من الطرق اللي ممكن تفك بيها الـ MD5 ..القصد ان الـ MD5 دي ضعيفة جدا و ممكن أي حد يفكها.
---
ثالثا: ايه نظام التشفير الجديد اللي هيتم في الموضوع ده؟
ببساطة هنشفر الباسوورد مرة تاني بحيث ان لو حد قدر يفك تشفير الباسوورد (و دا صعب جدا) هتطلعلو md5 hash ..يعني مش هتفيدو بحاجة و لازم يفك تشفير الـ MD5 عشان يعرف الباسوورد.
نظام التشفير اللي هنعملوا اسمه SHA1 و دا أقوى من الـ MD5 بس زي ما قولت هيبقى فيه تشفير ثنائي..يعني كأنك عامل باسوورد من 30 حرف و رقم زي كده : d6df873a6b1bc0043cc0cec9d4aabeda و مشفرها بالـ SHA1
---
رابعا : نبدأ الشرح :
الحاجات اللي هنغيرها :
-SQL Stored procedures
-SQL TB_User design
-PHP code
الـ Stored procedures اللي مسؤولة عن الحوار ده اتنين :
CertifyUser_ : خاصة بالـ SMC Login
CertifyTB_User_ :خاصة بالـ Ingame Login
ببساطة هنخش على CertifyUser_ و ندور على الحقول الخاص بالباسوورد :
هنلاقيه انه szPassword@
هنضيف متغير جديد و نسميه encpassword@ زي الصورة كده :
http://img705.imageshack.us/img705/7549/passwordsystem3.jpg
دلوقتي عشان نخلي الـ SMC يقرا المتغير الجديد ..ننزل تحت شوية و هنلاقي السطر دا : if (not exists(select JID from TB_User where JID = @nUserJID and password = @szPassword))نغير szPassword@ الى encpassword@ و ندوس Execute
http://img404.imageshack.us/img404/8656/passwordsystem4.jpg
و هنعمل نفس الحكاية في CertifyTB_User_ زي الصورة كدا :
http://img11.imageshack.us/img11/347/passwordsystem6.jpg
و تدوس Execute
كده خلصنا الجزء الأول
تاني حاجة هنخلي الـ TB_User يقرا الـ Binary data اللي هتبقا الباسووردات متخزنة على شكلها
أول حاجة لازم نعدل على حاجة في الـ Tools ->Options
نشيل علامة الصح من Prevent saving changes that require table re-creation
http://img195.imageshack.us/img195/1838/passwordsystem5.jpg
نيجي بعدين للـ TB_User
ندوس right click و نختار Design
هيطلع المربع دا ..نختار Password و نغيرها من varchar لـ (varbinary(20 و ندوس Save
http://img820.imageshack.us/img820/7435/passwordsystem7.jpg
كده خلصنا الجزء التاني
نيجي لجزء الـ PHP
الجزء دا مهم عشان اللي بيعمل أكونت أو بيغير الباسوورد أو بيخش عالموقع بالأكونت بتاعو
كل موقع و حسب الملفات بتاعتو بس كلهم في الاخر بيعملو Query للتعديل على TB_User
ف انتا تدور عندك في ملفات الـ Classes/Inlcudes/Register الخ على الـ Query دا
بالنسبة للـ Register هيبقى زي كدا :
$this->con->sql = "INSERT INTO dbo.TB_User (StrUserID, password, Email, reg_ip) VALUES ('$this->username', '$this->password', '$this->Email', '$ip');";هنغيره لـ
$this->con->sql = "INSERT INTO dbo.TB_User (StrUserID, password, Email, reg_ip) VALUES ('$this->username', (CONVERT(varbinary(max), (select hashbytes('sha1','$this->password')) , 2)), '$this->Email', '$ip');";باضافة الجزء الأحمر..و هكذا في الـ Scripts الخاصة بـ Password change/Login
ببساطة تغير 'this->password$' أو غيره (حسب اسم المتغير اللي المبرمج عاملو) الى
(CONVERT(varbinary(max), (select hashbytes('sha1','$this->password')) , 2))
---
خامسا: ازاي تغير باسوورد عن طريق الـ SQL ؟
أولا تخش عادي عالموقع دا www.md5.net و تكتب الباسوورد اللي انتا عايزها و تجيب الهاش بتاعها و لنفترض 123456
هيطلع الهاش دا :e10adc3949ba59abbe56e057f20f883e
و عن طريق كويري زي كده :
update TB_User
set password= (CONVERT(varbinary(max), (select hashbytes('sha1','e10adc3949ba59abbe56e057f20f883e ')) , 2))
where StrUserID='MyAccountID'
بس كده.. :thumb_yello:
---
سادسا : بالنسبة لأصحاب السيرفرات اللي عندهم أكونتات و عايزين يعملوا الموضوع دا عندهم :
أولا هتاخد backup من الداتابيز و ملفات الموقع
بعدين تعمل الكويري دا :
update TB_User
set password= (CONVERT(varbinary(max), (select hashbytes('sha1',password)) , 2))
بعديها تبدأ تعمل الخطوات اللي فوق زي ما هيا كده
---
سابعا: كام ملاحظة كده :
-الموضوع دا مش منقول من أي مكان..و لو في يوم من الأيام حد لقيه في موقع عربي أو أجنبي يبقى منقول من هنا.
-اللي عايز ينقله ينقله بشرط ذكر المصدر.
-الموضوع دا مجرب و شغال 100% و سيرفر Perfection شغال بيه حاليا.
-لو حد عنده أي استفسار أو مشكلة بخصوص الموضوع دا يسأل في الردود و أنا مش هتأخر عليه.
-أتقدم بالشكر لـ Sebastian عشان هوا اللي ساعدني في الحوار دا. :hypocrite1:
في أمان الله