ساخت یک تولیدکننده رمز عبور تصادفی و امن با پایتون
ﺯﻣﺎﻥ ﻣﻄﺎﻟﻌﻪ: 4 دقیقه

ساخت یک تولیدکننده رمز عبور تصادفی و امن با پایتون

انتخاب یک رمز عبور قوی، یکی از ساده‌ترین و در عین حال موثرترین راه‌های افزایش امنیت حساب‌های کاربری است. با این حال، بسیاری از افراد هنوز از رمزهای قابل حدس یا تکراری استفاده می‌کنند که در برابر حملات مختلف آسیب‌پذیر هستند.

در این مطلب یک تولیدکننده رمز عبور تصادفی و امن را با استفاده از زبان برنامه‌نویسی پایتون می‌سازیم. در این مسیر، با ماژول secrets آشنا می‌شویم و یاد می‌گیریم چگونه رمزهایی تولید کنیم که برای استفاده در حساب‌های کاربری مناسب‌تر باشند.

چرا از secrets استفاده کنیم؟

در پایتون چندین روش برای تولید اعداد و مقادیر تصادفی وجود دارد، اما همه آن‌ها برای اهداف امنیتی مناسب نیستند. بسیاری از برنامه‌نویسان در ابتدا از ماژول random استفاده می‌کنند، در حالی که این ماژول برای شبیه‌سازی و کاربردهای عمومی طراحی شده است، نه تولید رمزهای عبور.

برای تولید رمزهای امن، پایتون ماژولی به نام secrets را ارائه می‌دهد. این ماژول از منابع تصادفی سیستم‌عامل استفاده می‌کند و برای تولید رمز عبور، توکن‌های امنیتی و سایر داده‌های حساس مناسب است.

به همین دلیل، در این آموزش به‌جای random از secrets استفاده می‌کنیم تا رمزهای تولیدشده از امنیت بیشتری برخوردار باشند.

ساخت یک تولیدکننده رمز عبور با پایتون

اکنون که با ماژول secrets آشنا شدیم، می‌توانیم یک اسکریپت ساده برای تولید رمز عبور بنویسیم. در این مثال، از حروف کوچک و بزرگ انگلیسی، اعداد و نمادها برای ساخت یک رمز تصادفی استفاده می‌کنیم.

import secrets
import string

length = 16

characters = (
    string.ascii_letters +
    string.digits +
    string.punctuation
)

password = "".join(
    secrets.choice(characters)
    for _ in range(length)
)

print(password)

در این برنامه، ابتدا دو ماژول secrets و string را وارد می‌کنیم. ماژول string مجموعه‌ای از کاراکترهای آماده مانند حروف انگلیسی، اعداد و نمادها را در اختیار ما قرار می‌دهد و secrets وظیفه انتخاب تصادفی و امن این کاراکترها را بر عهده دارد.

متغیر length طول رمز عبور را مشخص می‌کند. در این مثال مقدار آن برابر با 16 است، اما می‌توانید آن را به هر عدد دیگری تغییر دهید.

سپس مجموعه‌ای از کاراکترهای مجاز ایجاد می‌کنیم:

  • string.ascii_letters شامل تمام حروف کوچک و بزرگ انگلیسی است.
  • string.digits اعداد ۰ تا ۹ را شامل می‌شود.
  • string.punctuation مجموعه‌ای از نمادها مانند !@#$%^&* را در اختیار ما قرار می‌دهد.

در نهایت، با استفاده از secrets.choice() به تعداد مشخص‌شده، کاراکترهایی از این مجموعه انتخاب شده و با متد join() در کنار هم قرار می‌گیرند تا رمز عبور نهایی ساخته شود.

هر بار که این برنامه را اجرا کنید، خروجی متفاوتی خواهید دید. برای مثال:

N&8xQm!2Lp#4aY@7

یا

rT$9vL8@qX2!bK6%

به دلیل استفاده از ماژول secrets، این رمزها برای استفاده در بسیاری از کاربردهای امنیتی، مانند ایجاد رمز عبور یا توکن‌های دسترسی، مناسب‌تر از رمزهایی هستند که با ماژول random تولید می‌شوند.

بهبود تولیدکننده رمز عبور

اسکریپتی که در بالا نوشتیم رمزهای تصادفی تولید می‌کند، اما یک مشکل کوچک دارد. از آنجا که انتخاب کاراکترها کاملا تصادفی است، ممکن است در برخی اجراها رمز عبور فاقد یکی از انواع کاراکترها باشد، برای مثال هیچ عدد یا نمادی در آن وجود نداشته باشد.

برای رفع این مشکل، می‌توانیم ابتدا یک حرف کوچک، یک حرف بزرگ، یک عدد و یک نماد را به‌صورت جداگانه انتخاب کنیم و سپس بقیه کاراکترها را به‌صورت تصادفی تولید کنیم. در پایان نیز ترتیب آن‌ها را به هم می‌زنیم تا الگوی مشخصی نداشته باشند.

import secrets
import string
import random

length = 16

password = [
    secrets.choice(string.ascii_lowercase),
    secrets.choice(string.ascii_uppercase),
    secrets.choice(string.digits),
    secrets.choice(string.punctuation)
]

characters = (
    string.ascii_letters +
    string.digits +
    string.punctuation
)

for _ in range(length - 4):
    password.append(secrets.choice(characters))

secrets.SystemRandom().shuffle(password)

print("".join(password))

در این نسخه، ابتدا چهار کاراکتر ضروری انتخاب می‌شوند و سپس باقی رمز از میان تمام کاراکترهای مجاز تکمیل می‌شود. در انتها نیز با استفاده از SystemRandom().shuffle() ترتیب کاراکترها به‌صورت امن به هم ریخته می‌شود تا محل قرارگیری حروف، اعداد و نمادها قابل پیش‌بینی نباشد.

به این ترتیب، هر رمز عبور تولیدشده علاوه بر تصادفی بودن، حداقل یک حرف کوچک، یک حرف بزرگ، یک عدد و یک نماد نیز خواهد داشت، ویژگی‌ای که بسیاری از وب‌سایت‌ها و سرویس‌ها برای رمزهای عبور قوی الزامی می‌دانند.

جمع‌بندی

در این مقاله یک تولیدکننده رمز عبور تصادفی و امن را با استفاده از پایتون ساختیم و دیدیم که برای کاربردهای امنیتی، استفاده از ماژول secrets انتخاب مناسب‌تری نسبت به random است. همچنین اسکریپت خود را بهبود دادیم تا رمزهای تولیدشده علاوه بر تصادفی بودن، شامل ترکیبی از حروف، اعداد و نمادها نیز باشند.

این پروژه نمونه‌ای ساده اما کاربردی از استفاده پایتون در حوزه امنیت است و می‌توانید آن را با قابلیت‌هایی مانند تعیین طول رمز، تولید چند رمز به‌صورت هم‌زمان یا ساخت یک رابط کاربری گرافیکی توسعه دهید.

چه امتیازی برای این مقاله میدهید؟

خیلی بد
بد
متوسط
خوب
عالی
در انتظار ثبت رای

/@arastoo
ارسطو عباسی
کارشناس تست نرم‌افزار و مستندات

...

دیدگاه و پرسش
برای ارسال دیدگاه لازم است وارد شده یا ثبت‌نام کنید ورود یا ثبت‌نام

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

ارسطو عباسی

کارشناس تست نرم‌افزار و مستندات