فهرست

جست‌وجوی ابزارهاگزارش تغییرات

برای جابه‌جایی برای باز کردنمسئله را توضیح دهید، نه نام ابزار را

راهنما

چه چیزی واقعاً یک رمز عبور را قوی می‌کند

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

قواعد پیچیدگی چیز اشتباهی را می‌سنجند

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

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

قاعده شکل رمز عبور را مقید می‌کند. مهاجم شکل‌ها را حدس نمی‌زند؛ رشته‌های محتمل را حدس می‌زند، و قواعدی که همه به یک شکل برآورده‌شان می‌کنند، شمردن رشته‌های محتمل را آسان‌تر می‌کنند.

پیش از ادامهٔ مطلب

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

  • بله، و با اختلاف زیاد: ۷۵ بیت در برابر ۵۲.

شانزده حرف کوچک، با اختلاف زیاد — حدود ۷۵ بیت آنتروپی در برابر ۵۲. طول، توان را ضرب می‌کند در حالی که الفبا فقط پایه را بالا می‌برد، پس افزودن نویسه هر بار بر افزودن نوع نویسه غلبه می‌کند. دقیقاً به همین دلیل قواعد ترکیب رمزهای ضعیف تولید می‌کنند و راهنمای فعلی به جای آن با طول آغاز می‌کند.

آنتروپی همان چیزی است که در برابر حدس زدن مقاومت می‌کند

سنجهٔ مفید این است که فرایند چند نتیجهٔ هم‌احتمال می‌توانست تولید کند.

entropy in bits = length x log2(size of the alphabet)

  8 characters, lowercase only        = 8 x 4.7  =  37.6 bits
  8 characters, all 94 printable      = 8 x 6.55 =  52.4 bits
 16 characters, lowercase only        = 16 x 4.7 =  75.2 bits
  4 words from a 7,776-word list      = 4 x 12.9 =  51.7 bits
  5 words from a 7,776-word list      = 5 x 12.9 =  64.6 bits

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

طول بر الفبا غلبه می‌کند. شانزده نویسهٔ کوچک بسیار قوی‌تر از هشت نویسهٔ مخلوط‌اند، چون طول، توان را ضرب می‌کند در حالی که الفبا فقط پایه را بالا می‌برد.

عبارتی به‌یادماندنی می‌تواند با رشته‌ای تصادفی برابری کند. چهار واژهٔ تصادفی تقریباً به قوت هشت نویسهٔ تصادفی قابل چاپ‌اند، و تایپ کردنشان روی تلفن به‌مراتب آسان‌تر است.

شرطی که همهٔ این‌ها را درست می‌کند

هر عدد بالا فرض می‌کند انتخاب تصادفی بوده است. نه «دلبخواهی»، نه «چیزی که به ذهنم نمی‌رسید» — تصادفی، از فرایندی بدون ترجیح.

عبارتی که خودتان انتخاب کرده‌اید تقریباً هیچ‌یک از آن آنتروپی را ندارد، چون شما به‌طور یکنواخت از میان ۷٬۷۷۶ واژه انتخاب نکرده‌اید؛ از میان چند صد واژه‌ای که به ذهنتان آمد انتخاب کرده‌اید، به ترتیبی که معنا می‌داد. شعر یک ترانه یا نام یک فیلم اساساً هیچ آنتروپی‌ای ندارد.

اینجا همان جایی هم هست که پیاده‌سازی‌ها به‌طور نامرئی اشتباه می‌کنند. Math.random یک مولد شبه‌تصادفی سریع است، با بذر مشخص و پیش‌بینی‌پذیر، و خروجی‌ای تولید می‌کند که دقیقاً به اندازهٔ نمونهٔ واقعی تصادفی به نظر می‌رسد. crypto.getRandomValues مرورگر همانی است که باید به کار برود، و ابزارهای اینجا همین کار را می‌کنند — اما هیچ چیزی در رشتهٔ حاصل به شما نمی‌گوید کدام‌یک به کار رفته، و به همین دلیل باید قاعده باشد نه قضاوتی که مورد به مورد انجام شود.

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

شناسهٔ تصادفی خودبه‌خود راز نیست

یک UUID نسخهٔ ۴ و یک رمز عبور تولیدشده ممکن است بایت‌هایشان را از همان منبع رمزنگاشتی مرورگر بگیرند، اما قراردادهایشان متفاوت است. UUIDv4 شش بیت از ۱۲۸ بیتش را صرف چیدمان قابل تشخیص نسخه و واریانت می‌کند و ۱۲۲ بیت باقی‌مانده را به کار می‌گیرد تا سیستم‌های مستقل بتوانند شناسه‌هایی با خطر تصادم ناچیز انتخاب کنند. کارش پرهیز از هماهنگی است، نه اثبات اینکه فراخواننده مجاز به عمل است.

راز احراز هویت مدل تهدیدی پیرامون حدس زدن، افشا، ذخیره‌سازی، ابطال و مقایسه دارد. RFC 9562 صراحتاً هشدار می‌دهد که نباید فرض شود حدس زدن UUIDها دشوار است و صرفِ در اختیار داشتن آن‌ها نباید دسترسی بدهد. پس UUID را به عنوان شناسهٔ پایگاه داده یا پیام به کار ببرید و توکن تصادفی اختصاصی یا رمز عبور را به عنوان اعتبارنامه. متنِ تصادفی‌نما بدون پروتکل درستی پیرامونش، یک ویژگی امنیتی نیست.

راهنمای فعلی واقعاً چه می‌گوید

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

  • طول عامل اصلی است. رمزهای طولانی را مجاز بدانید، و آن‌ها را نبُرید.
  • با فهرست‌های رمزهای لورفتهٔ شناخته‌شده مقایسه کنید به جای اعمال کلاس‌های نویسه.
  • چرخش زمان‌بندی‌شده را اجباری نکنید. رمزها را بدتر می‌کند نه بهتر، چون مردم فقط عددی را یکی بیشتر می‌کنند. با شواهدِ لو رفتن تغییر دهید.
  • چسباندن را مجاز بدانید، و هر نویسهٔ قابل چاپ را. مسدود کردن هر یک با مدیران رمز عبور می‌جنگد، که مؤثرترین کاری است که یک نفر می‌تواند بکند.

بیشتر سایت‌ها هنوز قواعد قدیمی را اعمال می‌کنند. پاسخ عملی یک مدیر رمز عبور به‌علاوهٔ یک مولد است: یکتا برای هر سایت، طولانی، و هرگز از حافظه تایپ‌نشده — و در آن نقطه، به‌یادماندنی بودنش دیگر هیچ اهمیتی ندارد.

پرسش‌های رایج

آیا قواعد پیچیدگی بی‌فایده‌اند؟

بی‌فایده نه، اما چیز اشتباهی را می‌سنجند و نتیجهٔ عکس می‌دهند. الزام به یک حرف بزرگ، یک رقم و یک نماد، `Password1!` را بسیار بیشتر از هر چیز غیرقابل‌حدسی تولید می‌کند، چون مردم قاعده را به ارزان‌ترین شکل برآورده می‌کنند. طول به‌علاوهٔ تصادفی بودن واقعی، مقاومت بسیار بیشتری با زحمت بسیار کمتری برای کاربر می‌دهد، و به همین دلیل راهنمای فعلی با همین‌ها آغاز می‌کند.

آیا عبارت عبور واقعاً به اندازهٔ یک رشتهٔ تصادفی قوی است؟

می‌تواند باشد، اگر واژه‌ها به‌طور تصادفی از فهرستی بزرگ انتخاب شده باشند و تعدادشان کافی باشد. چهار واژه که تصادفی از فهرستی ۷٬۷۷۶ تایی کشیده شده حدود ۵۱ بیت می‌دهد؛ پنج واژه ۶۴ بیت. آنچه آن را می‌شکند انتخاب واژه‌ها توسط خودتان است — عبارتی که به ذهنتان رسیده تصادفی نیست، و نقل کردن شعر یک ترانه بدتر از یک رشتهٔ تصادفی کوتاه است.

آیا تغییر رمز عبور هر ۹۰ روز کمک می‌کند؟

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

تصادفی بودن باید از کجا بیاید؟

از یک مولد امن رمزنگاشتی، که در مرورگر یعنی crypto.getRandomValues. Math.random چنین مولدی نیست — سریع است، بذر (seed) مشخصی دارد و آن‌قدر پیش‌بینی‌پذیر است که خروجی‌اش هرگز نباید برای چیزی محرمانه به کار رود. این تمایز در نتیجه نامرئی است، و دقیقاً به همین دلیل باید یک قاعده باشد نه یک قضاوت.

آیا یک UUID تصادفی نسخهٔ ۴ برای استفاده به عنوان رمز عبور یا کلید API امن است؟

نه. UUID نسخهٔ ۴ شناسه‌ای است با شش بیت ساختاری و ۱۲۲ بیت تصادفی، اما استانداردش آن را به عنوان راز احراز هویت تعریف نمی‌کند و هشدار می‌دهد که صرفِ در اختیار داشتن آن نباید به معنای اختیار باشد. از توکن یا رمز عبوری ساخته‌شده برای همین منظور استفاده کنید، با قواعد طول، چرخش و ذخیره‌سازیِ همان مرز امنیتی.

ابزارهای مرتبط

منابع