گروه خصوصی در چت روم
#1
Smile 
سلام من یک سوال دارم چطور میتوانم کاری کنم که افرادی که رمز دارند وارد چت روم بشوند در انجمن هم گشتم و فقط یک سورس پیدا کردم که کاربرد زیادی برایم نداشت ممنون میشم راهنماییم کنید.با تشکر
 
بزودی بازی من
  پاسخ


 سپاس شده توسط:
#2
(1399/10/15، 11:41 عصر)kiarashb نوشته است: سلام من یک سوال دارم چطور میتوانم کاری کنم که افرادی که رمز دارند وارد چت روم بشوند در انجمن هم گشتم و فقط یک سورس پیدا کردم که کاربرد زیادی برایم نداشت ممنون میشم راهنماییم کنید.با تشکر
 
سلام؛
اگر من جای شما بودم برای پیاده سازی این مسئله از الگوریتم Shamir's Secret Sharing ایده میگرفتم. با استفاده از ایـن الگوریتم شما قادر هستین برای تعداد a کاربر به طور اختصاصی برای هر کدوم یک کلید منحصر به فرد تعیین کنین. در ضمن میتونین تعیین کنین که در صورت حضور یه تعداد مشخصی از کاربرها امکان ورود به چت روم وجود داشته باشه. از بررسی این ویژگی الگوریتم به خاطر اینکه شما میخواین هر کاربری بدون نیاز به حضور دیگران به چت روم وارد بشه صرف نظر کردم.
 این الگوریتم مبتنی بر توابع درجه دوم (سهمی ها) و یا توابع خطی هست. ما در ادامه از توابع خطی برای کـار با الگوریتم استفاده می کنیم. اما چطور این الگوریتم رو باید در پروژه تون به کار ببندین؟
قبل از هر چیز باید یک مقدار عددی تصادفی (رندوم) به نام S بین تمامی کاربران توافق بشه. میتونین این کار رو با ایجاد یک روم (اتاق) مخصوص در شیء مولتی پلیر کانستراکت انجام بدین. به طوری که یک کاربر (هاست یا پیر) مقدار S رو تعیین میکنه و برای سایرین Broadcast میکنه. به این شکل سایر کاربرها هم از مقدار S باخبر میشن. در ضمن تمامی کاربرها باید از طریق شیء لوکال استورج و یا وب استورج اقدام به ذحیره سازی مقدار عددی S کنن چـرا که بعدها لازمشون میشه! حالا همون کاربری که مقدار S رو ایجاد کرده و برای بقیه Broadcast کـرده زحمت ساخت کلیدها (رمزهای عبور) سایر رفقا رو هم میکشه و در پایان برای هر کس کلید منحصر به فردش رو ارسال میکنه. 
بعد از اینکه مقدار S رو که یک عدد هست مشخص کردیم، باید یه نگاهی به شرایط بندازیم. یعنی ببینیم چند کاربر داریم.
تعداد کل کاربرها رو از اینجا به بعد با n و تعداد کلیدهایی که باید بسازیم رو با k مشخص میکنیم. باید مقدار k رو برابر با (تعداد کل کاربران × 2) در نظر بگیریم. از اینجای کار به بعد وارد فاز محاسبات الگوریتم میشیم. 
شرح الگوریتم: 
کاربران مـا بر سر مقدار S = 1742 توافق کردن. با فرض اینکه در کل 2 کاربر داشته باشیم باید مقادیر n و k رو به ترتیب 2 و 4 (2×2) تصور کنیم. حالا باید به سراغ تابع f(x) = S + bx بریم. متغیر b در این تابع میتونه یک عدد رندوم باشه که ما به طور مثال عدد 64 رو انتخاب میکنیم. متغیر S رو هم که راجع بهش قبلتر بحث کردیم. پس با این تفاسیر باید تابع رو به شکل زیر بازنویسی کنیم:
کد:
f(x) = 1742 + 64x
حالا باید به ازای یک تا k در تابع ایجاد شده x جای گذاری کنیم. پس خروجی تابع بالا رو به ازای 1 و 2 و 3 و 4 (از یک تا 4) به دست میاریم:
[تصویر:  Picture3.png]
خُب در نهایت ما به چهارتا مختصات (زوج مرتب) رسیدیم که هر دوتا مختصات (زوج مرتب) میتونن کلید (رمز) یکی از دو کـاربرها باشن. مثلاً برای کاربر دوم میتونیم رمز 3/1934-4/1998 رو متصور بشیم. اما حواسمون باشه که خط تیره دو مختصات (زوج مرتب) رو از هم تفکیک میکنه. میتونین در کانستراکت این مسائل رو با اکسپرشن های tokenat و یا tokencount و یا با عبارات با قاعده (Regex) مدیریت کنین.
اما حکمت اینکه ما دو مختصات (زوج مرتب) برای هر کاربر به عنوان رمز (کلید) در نظر میگیریم چیه؟ خُب خیلی ساده است! اصولاً زمانی ما میتونیم یک خط رو رسم کنیم که دست کم دو نقطه اش رو داشته باشیم. پس مجبوریم برای هر کاربر دو زوج مرتب (مختصات) رو به عنوان رمز (کلید) در نظر بگیریم.
خُب تا به اینجای کار ما به خوبی و خوشی رمز (کلید) هر یک از دو کاربر رو ساختیم و تحویلشون میدیم. حالا فرض کنیم یه کاربری میخواد با رمزش وارد چت روم بشه. چطور مطمئن بشیم رمزی که وارد میکنه با مقدار S ذخیره شده توسط لوکال استورج یا وب استورج مطابقت داره؟
برای حصول اطمینان از درستی رمز (کلید) وارده توسط کاربر باید از فرمول های زیر استفاده کنیم تا در نهایت بتونیم تابع خطی که در مرحله ایجاد کلیدها ساختیم رو مجدداً بسازیم و مقدار S رو با مقداری که ذخیره کردیم تطابق بدیم.

[تصویر:  Picture4.png]
فرض کنیم کاربر رمز عبور 1/1806-2/1870 رو وارد کرده باشه. برای حصول اطمینان از صحت رمز عبور محاسبات رو به شکل زیر انجام میدیم:
[تصویر:  Picture5.png]چون مقدار S ای که توسط شیء لوکال استورج ذخیره کردیم با مقداری که برای پارامتر S تابع f(x) = bx + S به دست آوردیم تطابق کامل داره پس به این نتیجه میرسیم کاربر رمز (کلید) معتبری رو وارد کرده و بهش مجوز ورود به چت روم رو میدیم.
موفق باشین.
غایب
  پاسخ


 سپاس شده توسط: kiarashb
#3
ممنون اما اگر بخواهیم برای همه کاربران یک رمز تعین کنیم چیکار باید بکنیم؟ببخشید که زحمتتون دادم
بزودی بازی من
  پاسخ


 سپاس شده توسط:
#4
(1399/10/16، 10:16 صبح)kiarashb نوشته است: ممنون اما اگر بخواهیم برای همه کاربران یک رمز تعین کنیم چیکار باید بکنیم؟ببخشید که زحمتتون دادم
سلام؛
اگـر به ارسال اولم دقت میکردین، گفته بودم که باید یک روم (اتاق) مخصوص تبادل مقدار S و مقدار کلید (رمز) بین کاربران بسازین. به عبارت دیگه:
  • * 1- یک پیر (Peer) یا هاست (Host) مقدار S رو مشخص میکنه و برای سایر کاربران Broadcast میکنه. بقیه کاربرها هم به محض دریافت مقدار S با شیء لوکال استورج و یا وب استورج به صورت دائمی اون رو در دستگاه خودشون ذخیره میکنن.
  • * 2- بعد همون پیر یا هاست و یا هر کاربر خودش به تنهایی اقدام به ساخت رمزها میکنن. کـه خُب بهتر اینه هـر کـاربری خودش رمز (کلید) مخصوص به خودش رو ایجاد کنه. دقت کنین هیچ لزومی نداره شما حتماً مقادیر یک تا k رو به عنوان ورودی بـه تابع ( f(x) = S + bx ) وارد کنین. شما میتونین هر مقدار عددی دلخواهی رو به عنوان ورودی این تابع خطی در نظر بگیرین که توصیه من اینه که حتماً یه مقدار عددی دلخواه رو برای ساختن کلید هر کاربر به تابع تزریق کنین چـون اینطوری باعث میشه رمز کاربرها به سادگی قابل تشخیص نباشه.
  • * ?? اما چطور رمز (کلید) هر کاربر رو از این فُرم بی ریخت x/xxx-x/xxx خارج کنیم و بهش یه نظمی بدیم؟
حقیقت اینه که این قسمت ماجرا میتونه کاملاً ابتکاری باشه. من ترجیح میدم مقدار عددی S رو از حالت دسیمال (ده دهی) به دودویی (باینری) تبدیل کنم. با فرض اینکه مقدار S = 1742 باشه در دستگاه باینری تبدیل به 11011001110 میشه. بعد از اینکار میام دو زوج مرتبی (مختصاتی) کـه رمز کاربر رو تشکیل میده انتخاب میکنم.
مثلاً فرض میکنیم دو زوج مرتب رو در اختیار داریم. حالا برای ساخت رمز (کلید) کـاربر به شکل زیر عمل میکنم. به خاطر داشته باشین در ادامه منظور از عملگر [+] جمع ریاضی نیست و صرفاً معنی الحاق ارقام به هم دیگه رو میده. در ضمن باید هر یک از عرض ها یا طول های زوج مرتب هایی که داریم رو به باینری تبدیل کنیم.
[تصویر:  d.png]
در واقع ما از S برای ایجاد تمایز بین طول ها و عرض های زوج مرتب هایی که داریم استفاده می کنیم. حالا وقتشه عدد باینری رو با توجه به اینکه دو زوج مرتب (1870 و 2) و (1806 و 1) رو در اختیار داریم بسازیم. 
[تصویر:  ksjg.png]
حـالا اگر مقدار باینری به دست اومده رو به دسیمال (ده دهی) برگردونیم، حاصل عدد 266759623358707534 خواهد بود. ما این عدد رو به عنوان رمز عبور به کاربر ارائه میکنیم.
به طور کلی طول (تعداد ارقام) رمز عبور هـر کـاربر رو میتونیم از طریق فرمول زیر به دست بیاریم:
[تصویر:  %D8%AA%D9%84%D8%A8.png]
در فرمول بالا نماد ( ⌊  ⌋ ) به معنای جزء صحیح (floor) هست. اگر بخوایم این فرمول رو در قالب یک اکسپرشن در کانستراکت بنویسیم باید به شکل زیر عمل کنیم (فرض من بر این مبنا بوده که 5 متغیر عددی x0، y0، x1 و y1 و s از نوع گلوبال در پروژه وجود داره):
کد:
(3*(floor((log10(s)/log10(2)))+1))+floor((log10(x0)/log10(2)))+floor((log10(y0)/log10(2)))+floor((log10(x1)/log10(2)))+floor((log10(y1)/log10(2)))+4
حالا فرض کنیم قصد داریم صحت رمز وارد شده توسط کاربر رو بررسی کنیم. برای اینکه این عدد رو به دو زوج مرتب تبدیل کنیم تا بتونیم محاسبات اعتبارسنجی رو انجام بدیم طبیعتاً باید عدد وارد شده توسط کاربر رو به فرمت باینری برگردونیم. اگر رمز عبوری که کـاربـر وارد کرده به طور مثال 266759623358707534 بوده باشه با تبدیل این عدد به باینری خروجی 1110110011101110000111011011001110101101100111011101001110 به دست میاد. حالا چطور از این عدد باینری به دو زوج مرتب برسیم؟ برای اینکار من در کانستراکت یک تابع بـه نام  split_binary نوشتم. تابعی که تعریف کردم به کمک عبارات با قاعده و اکسپرشن های بومی کانستراکت مثل replace و tokenat دو زوج مرتب رو استخراج میکنه و هر زوج مرتب رو یکی از دو خانه های آرایه تک بعدی ذخیره سازی میکنه. مقدار پارامتر اول (0) تابع باید برابر با خـروجی باینری به دست اومده از عدد وارد شده توسط کـاربر و همینطور مقدار پارامتر دوم (1) تابع باید برابر با مقدار باینری S باشه. 
[تصویر:  %DB%8C.png]
حالا اگر همین تابع رو برای شرایط فعلی اعمال کنم می بینم که دو زوج مرتب به دست میان.
[تصویر:  ds.png]
حالا باید هر یک از طول ها و عرض ها رو از فُرم باینری به فُرم ده دهی (دسیمال) برگردونم تا بتونم محاسبات اعتبارسنجی رو انجام بدم. در نـهـایـت یا میتونی لقمه رو مثل من اینطوری چند دور بچرخونی و بعد وارد دهان کنی یا هم از هر ابتکار دیگه ای که به ذهن خودت میرسه استفاده کنی!
در ضمن میتونی سورس تابع  split_binary رو از اینجا دریافت کنی.
اگـر احـیـانـاً منظورت این بوده که همه کاربران از یک رمز یکسان برای ورود به چت روم استفاده کنن (که خُب خیلی جالب نیست از نظر امنیتی!) که نیاز به این همه بگیر و ببند نیست! فقط کافیه یک روم (اتاق) بسازی، یکی هاست یا پیر یه مقدار رندوم رو انتخاب کنه، برای بقیه Broadcast کنه و بقیه هم به صورت دائمی با لوکال استورج یا وب استورج ذخیره اش کنن. بعد هم هر زمان کاربر رمز عبور رو وارد کرد با مقدار ذخیره شده تطابقش میدی.
بـه هـر حـال من سعی کردم پاسخ کاملی بنویسم تا منظورت هر چی که بوده متوجه بشی.
موفق باشـی.
غایب
  پاسخ


 سپاس شده توسط: kiarashb ، ghasem ، oak
#5
خیلی ممنونم از شما
بزودی بازی من
  پاسخ


 سپاس شده توسط:


موضوع‌های مشابه…
موضوع نویسنده پاسخ بازدید آخرین ارسال
Information پرداخت درون برنامه مایکت کوردوا ya mahdi 0 230 1404/1/17، 05:43 عصر
آخرین ارسال: ya mahdi
  نحوه خروجی اندروید کوردوا ya mahdi 0 176 1404/1/11، 04:06 عصر
آخرین ارسال: ya mahdi
Wink حل شده مقادير لازم در environment variable ᔕinaᗪehghani 24 11,595 1403/10/23، 12:10 صبح
آخرین ارسال: Tggi
  تپسل .....فروشگاه Hamidreza 3 1,932 1403/10/22، 11:57 عصر
آخرین ارسال: Tggi
  خروجی اندروید با Intel xdk ya mahdi 0 130 1403/8/25، 02:08 عصر
آخرین ارسال: ya mahdi

پرش به انجمن: