ساخت پسورد «زیادی قوی» با پایتون

آقا سلام.این پست رو به پاس تمام مثلا هکر هایی مینویسم که با AndroDumpper میان و وای فای مردم رو هک میکنن و فقط تنها چیزی که عاید قربانی میشه اتمام ترافیک در موارد اورژانسی هست.چرا این پست رو نوشتم؟نزدیک ۱ ساله که پسورد وای فای رو عوض نکردم و حوصله فکر کردن برای رمز خوب و قوی نداشتم که ناگهان یه چیزی به ذهنم رسید. اونم این بود که چرا از پایتون کمک نگیرم؟ این دلیلی شد که برنامه ای ساده به زبان پایتون بنویسم که برای من پسورد تولید میکرد و از تریلیون ها حالت (شایدم بیشتر!) یکیش میشه پسورد من.در ادامه با هم دیگه شرحی بر نحوه کار برنامه رو بهتون میگم در نهایت از سایت Security.org برای تست قدرت پسورد تولید شده استفاده میکنیم.پیش نیازآشنایی با پایتونیه IDE مناسب برای راحتی در تمرین (مثلا Visual Studio Code) یا IDLE خود پایتونقبل از همه، چی از جون پایتون میخوام؟اولین کاری که باید هر برنامه نویس یا انسانی بکنه تعیین هدف هست و ترسیم نقشه راه (الگوریتم) (البته اینجا از فلوچارت استفاده نمیکنم).پسوردی که طولانی باشهترکیبی از حرف و عدد و علائم نگارشی و خاص باشهحروف بزررگ و کوچیک لاتین توش باشه (همون انگلیسی خودمون:) )حروف فارسی! هم برای محکم کاری توش باشهکاملا به هم ریخته باشه و احتمال نشون دادن نتیجه مشابه خیلی کم باشهدر نهایت به اندازه کافی قوی باشهقبل از ادامه دادن من دوتا راه حل دارم که یکی استفاده از کلاس Shuffle و دیگری نوشتن الگوریتم توسط خودمون (از ۰ تا ۱۰۰) هست که بدلیل اینکه استفاده از الگوریتم های آماده یکم خزه! (نه اینکه خز باشه دوست دارم کنار هم پیادش کنیم) بنابراین قسمت اول رو اختصاص میدم به نوشتن الگوریتم و یه سری توضیحاتی میدم ولی مورد دوم که استفاده از Shuffle هست رو بدون توضیح و فقط کد میزارم‌ (چون چیز خاصی برای توضیح بعد از خوندن قسمت اول باقی نمیمونه نمیخوام اطاله وقت و کلام بشه)بریم سراغ کد زدن پایتوناول از ماژول random کلاس های shuffle (برای قسمت دوم) و randint رو ایمپورت می کنیم. بعد از اون باید چهارتا متغیر از نوع str تعریف کنیم که به هر کدوم کل حروف لاتین، فارسی، عدد و علائم نگارشی و خاص رو در بر میگیرن که به صورت پشت سرهم و بدون فاصله قرار میگیرن.حالا نوبت این هست که یه تابع تعریف کنیم به اسم sampler «نمونه بردار».کار این تابع به این صورت هست که ۴ بار به صورت تصادفی سه کاراکتر از هرکدوم از رشته هایی که تعریف کردیم رو انتخاب میکنه و پس از پایان هر دور میریزه توی یه متغیر از نوع رشته به اسم sample «نمونه».‌ برای این کار از حلقه های تو در تو «Nested loops» استفاده میکنم.خروجی کد زیر، رشته ای به طول ۴۸ کاراکتر هست.خب، تا اینجا اومدیم و یه رشته از کاراکتر های رندوم رو تولید کردیم که در همین نقطه ای که هستیم بسیار مطلوب و قوی هست ولی من یکم دلم overkill کردن میخواد « معنی این رو به عنوان تمرین به خوتون میسپرم :) » و تا این حد بسنده نمیکنم و دوست دارم که رشته ای که به عنوان پسورد بهم تحویل داده میشه رو بازم بهم بریزم و قاطیش کنم تا کرک کردنش سخت تر بشه.برای انجام این کار یه تابع دیگه تعریف می کنیم به اسم scrambler «همزن، مخلوط کن، بهم ریز?».(به فارسی سخت) کارش به این صورت هست که یه آرگومان رشته ای قبول میکنه که نتیجه تابع sampler تولید شده رو به عنوان پارامتر بهش پاس میدیم (اولین بارمه که دارم اینجوری برای کسی توضیح میدم اگر مشکلی بود احتمالا خواننده های Senior بهم بگین :) ).به طور ساده تر قراره که همون پسوردی که تولید کردیم رو قراره بیشتر بهم بریزیم و خلاص! کافیه فقط یه تابع به نام scrambler تعریف کنیم.اول ببینیم تابع Scrambler چیکار قراره برامون بکنه؟برای اینکه کد بیش از اندازه پیچیده نشه (حداقل برای نوشتن توی ویرگول، وگرنه میشه جلوتر رفت) قراره رشته رو به چهار قسمت مساوی ۱۲ کاراکتری می بریم (string slicing) و نتیجه رو توی یه لیست ذخیره میکنیم. و با استفاده از یه حلقه for به صورت رندوم عناصر لیست رو از تو قبر میکشیم بیرون ه هی همین چرخو...، نه اشتباه شد!، همین عناصر استخراجی رو رو به یه متغیر که پسورد نهایی ما رو قراره نگه داره پاس میدیم.این کار شبیه به قاطی کردن کارت های پاسور هست (اگر دیده باشین)توضیح مختصر این قسمت (به ترتیب کد)دوتا متغیر تعریف میکنیم که به ترتیب لیست رشته های ۱۲ کاراکتری رو میگیره و بعدی خروجی نهایی (همون پسورد) هست.بعدش طبق گفته های قبلی میایم رشته رو برش میدیم و توی لیست میریزیم.یه متغیر هم تعریف میکنیم که طول لیست رو میگیره و برای اینکه در ادامه به اررور List Index Out Of Range برخورد نکنیم یک واحد کم میکنیم (چون از کامپیوتر از ۰ شمارش میکنه).یه حلقه for میزنیم و در بدنه حلقه متغیری تعریف میکنیم که بهش ایندکس رندوم یکی از عناصر لیست پاس داده میشه.در ادامه آماده هستیم که با استفاده از ایندکس به دست اومده،‌ عنصر مدنظر رو به output_string که قراره خروجی نهایی یا همون پسوردمون باشه پاس میدیم.در نهایت برای جلوگیری از تکرارشدن عنصر انتخاب شده رو از لیست حذف میکنیم و در نهایت یک واحد از طول لیست کم میکنیم.آخر سر هم میرسیم به return output_string که پسورد رو به ما تحویل میده.در نهایت با دستور پرینت میتونیم به خروجی دست پیدا کنیم. اگر خواستین میتونین یه برنامه که پسورد لیست «البته نه اون پسورد لیستی که برای کرک کردن پسورد استفاده میشه!» میسازه درست کنین و مثلا ۵۰۰ تا پسورد تولید کنین و توی یه فایل ذخیرش کنین و کلی کار دیگه فقط کافیه که یدونه حلقه for بزنین و بقیه ماجرا.قسمت دوم : استفاده از Shuffleتست قدرت پسورد های تولید شده ما با سایت Security.orgاول تست پسوردی که با الگوریتم خودمون نوشتیم : zsLموو256;\XLrنیگ867?_xDhگجر604%\نتیجه فوق العاده بزرگ هست ۲ هزار کواتر دسیلیون سال طول میکشه به به عبارتی یه ۲ جلوش ۸۷ تا صفر!!!!!به عبارتی از سن کنونی جهان هم بیشتره (تقریبا ۱۴ ضرب در ده به توان ۷۶ برابر بیشتره)حالا نوبت میرسه به تست پسوردی که با Shuffle نوشتیمRNGذبه640<|xWvکرظ091&\vPqنثف895])نتیجه یکسان هست که البته به دلیل بزرگی بیش از اندازه عدد مذکور سایت دیگه اختلافات کوچیک رو نشون نمیده.نتیجه اخلاقیپسورد های قوی به معنای امنیت مطلق نیستن و امنیت دقیقا چیز نسبی هست و بالاخره این پسورد ها کرک میشن ولی تا یه مدت محدودی (حتی اگر ۱۰۰ سال هم طول بکشه بازم زمان محدودی هست) امنیت نسبی ایجاد میکنه.یه چیز دیگه، خواهرم الان کنارم بود و گفت طبق اصل لانه کبوتری در بدترین حالت میشه به صورت شانسی پسورد رو کرک کرد‌ :) که این دیگه ربطی به بحث ما نداره و میره به محافظت از اطلاعات و این جور موارد.خب این قسمت هم به خوبی و خوشی تموم شد امید وارم که لذت برده باشین.ارادتمند همتون alishimist OUTپست های دیگه من: https://vrgl.ir/70E4O https://vrgl.ir/bodN9 https://vrgl.ir/mIQNZ https://vrgl.ir/umDxK https://vrgl.ir/WIKwj.r/Wwj