مولد رمز عبور تصادفی

* **مولد رمز عبور تصادفی** (به انگلیسی: **Random Password Generator**) نرم‌افزار یا سخت‌افزاری است که عددی را به عنوان ورودی از یک دستگاه دیگر که عدد تصادفی درست می‌کند، می‌گیرد و به صورت خودکار رمز عبور می‌سازد. این عدد یا به عبارتی این رمز عبورهای تصادفی از طریق روش‌های مختلفی ساخته می‌شوند. این روش می‌تواند تنها با استفاده از یک عدد تصادفی درست کردن، از طریق تابع‌های آمادهٔ زبان‌های برنامه‌نویسی باشد همچنین می‌تواند با استفاده از تابع‌های پیچیده تری پیاده‌سازی شود.اگر بخواهیم به صورت ساده بیان کنیم ما چون عدد تصادفی در کامپیوتر نداریم عملیات رندوم روی آن عدد ورودی انجام خواهیم داد.

## رمزهای عبور تصادفی
این تصادفی بودن عدد و رمز عبور می‌تواند درجه‌های مختلفی داشته باشد. تعداد زیادی سایت‌ها و åبرنامه‌های مختلفی وجود دارند که توابع مختلفی برای ساخت زمز عبور تصادفی ارائه می‌دهند و تعدادی از این توابع را در ادامه نشان داده شده‌اند .رمز عبورها در واقع کلیدی برای دسترسی به اطلاعات اشخاص هستند بنابراین اهمیت آنها بسیار واضح است اما اهمیت رمز عبورهای تصادفی را می‌توان زمانی فهمید که مرورگرهای اینترنت از جمله گوگل کروم و فایر فاکس و از این دست مرورگرهای معتبر در خود مولد رمز عبور تصادفی دارند و هنگامی که متوجه می‌شوند که می‌خواهید در سایتی ثبت نام و رمز عبور انتخاب کنید، به شما یک رمز عبور تصادفی پیشنهاد می‌دهند و پس از زدن رمز عبور، آن را در خود ذخیره می‌کنند که در واقع یکی از ابزارهای این مرورگرها مدیریت رمز عبور هامی باشد. این گونه ابزارها برای برنامه‌های مختلف در سیستم عامل اندروید از طریق برنامهٔ اصلی گوگل تعبیه شده‌اند .از آنجایی که کد منبع اینگونه برنامه‌ها را در اختیار نداریم برای اطمینان بیشتر از تابع مولد رمز عبور تصادفی و میزان تصادفی بودن آن می‌توان از منابع آزاد (متن‌باز) که کد منبع آنها در دسترس است، استفاده کرد .برای اینکه میزان تصادفی بودن رمز عبور را زیاد یا کم کرد می‌توان از عناصر مختلفی در رمز عبور استفاده کرد. به عنوان مثال رمز عبور می‌تواند تنها از اعداد تشکیل شده باشد یا حاوی کاراکترهای الفبایی یا کاراکترهای نگارشی مثل " _ ,) , (, [,] , * , # , @ " باشد. در واقع هدف از رمز عبور تصادفی این است که رمزهای عبور به راحتی قابل حدس زدن نباشند از طرفی به قدری هم سخت نباشند که قابل بازیابی نباشند .

## روش‌های مختلف ایجاد رمز عبور تصادفی
### روش نرم‌افزاری
مولد رمز عبور تصادفی هم با استفاده از اعداد تصادفی و هم با استفاده از شبه تصادفی که از طریق مولد اعداد شبه تصادفی ساخته می‌شود کار می‌کند اما اعداد شبه تصادفی کاملاً تصادفی نیستند و در واقع یک دنبالهٔ از قبل تعیین شده دارند و قابل پیش‌بینی هستند؛ بنابراین از توابعی مانند تابع ()rand که در زبان‌های برنامه‌نویسی هست می‌توان استفاده کرد اما امنیت لازم را ندارد.

#### [[پی‌اچ‌پی]]

```php
function randomPassword() {
    $alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
    $pass = array();
    $alphaLength = strlen($alphabet) - 1;
    for ($i = 0; $i < 8; $i++) {
        $n = rand(0, $alphaLength);
        $pass[] = $alphabet[$n];
    }
    return implode($pass);
}
```

از تابع مذکور و تنها از حروف کوچک و بزرگ الفبای انگلیسی و اعداد استفاده شده‌است.

#### [[سی شارپ]]
در کد زیر که نشان داده شده‌است میزان خوبی از عناصری که می‌توانند در رمز عبور بیایند گنجانده شده‌اند و در صورت نیاز کاربر می‌توان از عنصرهای مختلفی استفاده کرد.


```c#
//Written by Paul Seal. Licensed under MIT. Free for private and commercial uses.

using System;
using System.Text.RegularExpressions;
using CodeShare.Library.Passwords;

namespace CodeShare.Library.Passwords
{
    public static class PasswordGenerator
    {

        public static string GeneratePassword(bool includeLowercase, bool includeUppercase, bool includeNumeric, bool includeSpecial, bool includeSpaces, int lengthOfPassword)
        {
            const int MAXIMUM_IDENTICAL_CONSECUTIVE_CHARS = 2;
            const string LOWERCASE_CHARACTERS = "abcdefghijklmnopqrstuvwxyz";
            const string UPPERCASE_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            const string NUMERIC_CHARACTERS = "0123456789";
            const string SPECIAL_CHARACTERS = "!#$%&*@\";
            const string SPACE_CHARACTER = " ";
            const int PASSWORD_LENGTH_MIN = 8;
            const int PASSWORD_LENGTH_MAX = 128;

            if (lengthOfPassword < PASSWORD_LENGTH_MIN || lengthOfPassword > PASSWORD_LENGTH_MAX)
            {
                return "Password length must be between 8 and 128.";
            }

            string characterSet = "";

            if (includeLowercase)
            {
                characterSet += LOWERCASE_CHARACTERS;
            }

            if (includeUppercase)
            {
                characterSet += UPPERCASE_CHARACTERS;
            }

            if (includeNumeric)
            {
                characterSet += NUMERIC_CHARACTERS;
            }

            if (includeSpecial)
            {
                characterSet += SPECIAL_CHARACTERS;
            }

            if (includeSpaces)
            {
                characterSet += SPACE_CHARACTER;
            }

            char[] password = new char[lengthOfPassword];
            int characterSetLength = characterSet.Length;

            System.Random random = new System.Random();
            for (int characterPosition = 0; characterPosition < lengthOfPassword; characterPosition++)
            {
                password[characterPosition] = characterSet[random.Next(characterSetLength - 1)];

                bool moreThanTwoIdenticalInARow =
                    characterPosition > MAXIMUM_IDENTICAL_CONSECUTIVE_CHARS
                    && password[characterPosition] == password[characterPosition - 1]
                    && password[characterPosition - 1] == password[characterPosition - 2];

                if (moreThanTwoIdenticalInARow)
                {
                    characterPosition--;
                }
            }

            return string.Join(null, password);
        }
}
```


#### [[جاوا (زبان برنامه‌نویسی)|جاوا]]
در زبان جاوا مانند زبان‌های دیگر یک تابع پیش‌فرض برای تولید عدد تصادفی دارد که گفته شد که در اصل شبه‌تصادفی است. در این زبان برای اینکه عدد تصادفی واقعی داشته باشیم کلاسی به نام SecureRandom به وجود آورده‌اند که در پایین کد مربوط به آن را می‌بینید.

```java
import java.security.SecureRandom;
import java.util.Random;

public class GenerateSecurePassword {
    private static final Random RANDOM = new SecureRandom();
    private static final String ALPHABET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    public static void main(String[] args) {
        int passwordLength = 10;

        String password = generatePassword(passwordLength);

        System.out.println("Secure password: " + password);
    }
    public static String generatePassword(int length) {
        StringBuilder returnValue = new StringBuilder(length);
        for (int i = 0; i < length; i++) {
            returnValue.append(ALPHABET.charAt(RANDOM.nextInt(ALPHABET.length())));
        }
        return new String(returnValue);
    }
}
```

از این دست کلاس‌ها مانند SecureRandom که عدد شبه تصادفی ایجاد نمی‌کنند می‌توان به CryptGenRandom نیز اشاره کرد که کاربردهای زیادی از جمله در ساختن کلید در سیستم عامل ویندوز دارد.

### روش سخت‌افزاری
در کامپیوترها و در محاسبات دستگاهی وجود دارد که با استفاده از الگوریتمی خاص و پروسه‌های فیزیکی یک عدد تصادفی ایجاد می‌کند که سخت‌افزار مولد عدد تصادفی نامیده می‌شود. تعداد کل کاراکترهایی که در اسکی (استاندارد) وجود دارند ۹۵ کاراکتر است. حال اگر یک جدول ۵×۱۹ داشته باشیم که خانه‌های آن را با کاراکترهای اسکی پر کرده باشیم، با سخت‌افزار مولد عدد تصادفی ابتدا عددی در بازه ۱ تا ۵ و سپس عددی در بازهٔ ۱ تا ۱۹ بدست آورده و کاراکتر خانهٔ متناظر آن در جدول را می‌خوانیم و در رشتهٔ رمز عبور قرار می‌دهیم .نسخهٔ جدول ۶×۶ برای حروف الفبای لاتین و اعداد به صورت زیر می‌باشد.

:

## استحکام رمز ایجاد شده
در سایت‌های مختلف دیده می‌شود زمانی که قصد انتخاب رمز عبور داریم نواری در مقابل آن وجود دارد که نشان می‌دهد که رمز عبوری که انتخاب کرده‌ایم از استحکام کافی برخوردار است یا خیر. استحکام گذرواژه مبحثی است که برای تمامی رمز عبورها مطرح می‌شود و بستگی به احتمال این دارد که در چند آزمایش یک فرد مهاجم می‌تواند این گذرواژه را حدس بزند .
در رابطه با استحکام رمز عبورهای تصادفی می‌توان گفت که در صورتی که هیچ‌کدام از کاراکترهایی که در رمز می‌آیند به هم وابسته نباشند، با استفاده از آنتروپی اطلاعات می‌توان فرمول زیر را نوشت (L طول رمز و N تعداد کل کاراکترهایی است که می‌توان در رمز به کار برد) :
H = L\,\log_2 N = L {\log N \over \log 2}

همان‌طور که در این فرمول مشاهده می‌شود، کارایی رمز عبور ایجاد شده به تعداد کاراکتری که می‌تواند استفاده کند (N) محدود می‌شود.

## منابع

## جستارهای وابسته و مرتبط
* مولد امن اعداد شبه‌تصادفی در رمزنگاری
* مولد اعداد شبه تصادفی
* رمزنگاری
* رمز دنباله‌ای

## مقاله‌های بیشتر
* رمز نگاری و پردازش تصویر https://www.academia.edu/12044531/رویکردی_نو_در_رمزنگاری_تصاویر_دیجیتال_مبتنی_بر_نگاشت_فوق_آشوبی
* کاربرد اعداد تصادفی در رمزنگاری (منتشر شده توسط روساریو گنارو در مجلهٔ مؤسسه مهندسان برق و الکترونیک https://ieeexplore.ieee.org/abstract/document/1621063
* اهمیت تصادفی بودن در رمزنگاری https://www.design-reuse.com/articles/27050/true-randomness-in-cryptography.html

رده:اصالت‌سنجی اسم رمز
رده:الگوریتم‌های رمزنگاری
رده:رمزنگاری