Table of Contents
چرا از جاوا اسکریپت برای نسل امن استفاده می کنیم؟
در توسعه وب مدرن، تولید پسوردهای قوی و کلیدهای امن در سمت مشتری مزایای مختلفی را ارائه می دهد. ubiquity جاوا اسکریپت در مرورگرهای اجازه می دهد تا توسعه دهندگان هزینه محاسباتی نسل رمز عبور را از سرورهای بارگیری کنند، کاهش تأخیر و بارگذاری سرور، همچنین بازخورد زمان واقعی را در هنگام ثبت کاربر، به روز رسانی های امن رمز عبور یا نسل بدون درخواست های شبکه اضافی، با این حال مهم است که اطلاعات امنیتی را در محیط قرار دهند و یا به طور تصادفی استفاده کنند:
چگونه به انتشار رمز عبور تصادفی در جاوا اسکریپت
ایجاد یک رمز عبور تصادفی شامل انتخاب شخصیت از یک مجموعه شخصیت تعریف شده و ساخت یک رشته از طول مورد نظر است.در زیر یک پیاده سازی اساسی است که تعادل خوبی از قابلیت خواندن و عملکرد را فراهم می کند:
function generatePassword(length) {
const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+[]{}|;:,.<>?";
let password = "";
for (let i = 0; i < length; i++) {
const randomIndex = Math.floor(Math.random() * charset.length);
password += charset[randomIndex];
}
return password;
}
console.log(generatePassword(12)); // Example output: "A3$kL9#zQ1%p"
در حالی که این کد برای بسیاری از برنامه های غیر بحرانی کار می کند، به [FLT] 1 متکی است که رمزنگاری شده ایمن است [برای محیط های تولیدی که نیاز به تصادفی واقعی دارند، API رمزنگاری وب باید به جای آن استفاده شود (در بخش بعدی پوشش داده شده است) همچنین توجه داشته باشید که شخصیت شامل شخصیت های مبهم مانند (F:2 و [F:3) می شود.
درک تنظیمات شخصیت و Entropy
قدرت یک رمز عبور به طور مستقیم به آنتروپی آن مربوط است - اندازه عدم پیش بینی (Entropy) محاسبه شده است به عنوان ، که در آن تعداد کاراکترهای احتمالی و طول رمز عبور با 72 کاراکتر (up، کمتر، دیجیتال، 10 خاص) و طول آنتروپی بالا برای حداقل 96.9 ثانیه تنظیم شده است.
ایجاد کلیدهای امن با Web Crypto API
برای نسل کلیدی رمزنگاری، توکن های API یا هر گونه راز که باید در برابر حملات brute-force مقاومت کند، از روش استفاده کنید.این تابع توسط CSPRNG سیستم عامل پشتیبانی می شود و در تمام مرورگرهای مدرن و Node.js (از طریق ماژول ) در زیر یک تابع است که یک کلید امن به عنوان یک رشته اومقعید ایجاد می کند:
function generateSecureKey(lengthInBytes) {
const array = new Uint8Array(lengthInBytes);
window.crypto.getRandomValues(array);
return Array.from(array, byte => byte.toString(16).padStart(2, '0')).join('');
}
console.log(generateSecureKey(32)); // Produces a 64-character hex string
این مثال یک کلید 32 بایت (256 بیتی) را ایجاد می کند که برای رمزگذاری AES-256 یا اسرار API با امنیت بالا مناسب است. روش آرایه را با مقادیر تصادفی از منبع آنتروپی سیستم پر می کند، اطمینان از یکنواختی توزیع و عدم پیش بینی.
کلیدهای امن رمزگذاری: Hex، Base64 و بیشتر
بایت های خام قابل خواندن نیستند.
- [[۱] [۱۰] [۱۰] [۱۰] [۱۰] [۱۰] [۱]]: هر بایت دو عدد از حروف ساده می شود، اما ۵۰٪ بزرگتر از بایت های خام است: [۳]
- Base64 : جمع آوری بیشتر (33٪ سربار)، رایج برای توکن های API و JWTs استفاده از در یک رشته، اما برای استفاده از داده های باینری (FLT 17) تبدیل.
- [[ویرایش] [۱] [۱۰] [۱۰] [۱] [۱] [۱۰] [۱] [۱۰] [۱] [۱] [۱۰]] [۱] [۱۰] [۱] [۱] [۱۰] [۳] [۱] [۳] [۱] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [و [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳]
در اینجا چگونگی تولید یک کلید امن Base64 را در اینجا مشاهده می کنیم:
function generateBase64Key(lengthInBytes) {
const array = new Uint8Array(lengthInBytes);
window.crypto.getRandomValues(array);
let binary = '';
array.forEach(byte => binary += String.fromCharCode(byte));
return btoa(binary);
}
console.log(generateBase64Key(32)); // 44-character Base64 string
برای محیط های Node.js، از و برای عملکرد مشابه استفاده کنید، همیشه اطمینان حاصل کنید که رمزگذاری برای پرونده استفاده شما مناسب است - هگزا برای نمایش، Base64 برای ذخیره سازی و Base64url برای URL ها رایج است.
بهترین روش ها برای Password و Key Generation
برای به حداکثر رساندن امنیت و قابلیت استفاده، این دستورالعمل ها را دنبال کنید:
- حداقل طول : رمز عبور باید حداقل 12 کاراکتر باشد؛ 16-20 برای حساب های حساس توصیه می شود. کلیدهای رمزنگاری باید حداقل 128 بیت (16 بایت) برای رمزگذاری متقارن، 256 بیت برای اطمینان بالاتر باشد.
- [[۱] [۱۰] [۱] [۱۰] [۱] [۱]] [[۳]]]: از بالا، پایین، رقم و شخصیت های خاص استفاده کنید، از شخصیت های مبهم اجتناب کنید (به عنوان مثال، [FLT ۲۵] [FLT۲۶]، [FLT۲۷]، .
- از Crypto API استفاده کنید: همیشه [FLT 29] را بر روی ترجیح دهید [FLT 31] به اندازه کافی قابل پیش بینی باشد که توسط یک مهاجم مشخص معکوس شود.
- انتقال ناامن : کلید های ژن شده باید بر روی HTTPS /TLS ارسال شوند هرگز آنها را در کد منبع مشتری یا logs قرار ندهید.
- [FLT: 1 ] اگر رمز عبور ذخیره کنید، هرگز متن ساده تولید نشده را ذخیره نکنید. Hash با یک الگوریتم قوی (bcrypt، Argon2) و یک نمک منحصر به فرد.
- سیاست های هدایت : کلید های API و رمز عبور باید به صورت دوره ای (به عنوان مثال، هر 90 روز) چرخش کنند مگر اینکه توکن های کوتاه مدت داشته باشند.
- از کتابخانه های تاسیس شده استفاده کنید؛ برای پروژه های بزرگ، کتابخانه هایی مانند برای v4 UUID یا برای شناسه های URL پسند، اما برای نسل ساده رمز عبور، چند خط جاوا اسکریپت کافی است.
بررسی های متداول و امنیتی
ایجاد اسرار در سمت مشتری چندین ریسک را که توسعه دهندگان باید کاهش دهند، معرفی می کند:
دانلود بازی Cross-Site Scripting (XSS)
اگر یک مهاجم بتواند جاوا اسکریپت را به صفحه شما تزریق کند، می تواند هر رمز عبور یا کلید تولید شده را بخواند، همیشه ورودی کاربر را حفظ کند، از سیاست امنیت محتوا (CSP) استفاده کند و از قرار دادن مقادیر تولید شده به طور مستقیم به DOM بدون فرار خودداری کند.
عدم موفقیت
استفاده از برای کلیدها خطرناک است. الگوریتم (اغلب XorShift128+) برای امنیت رمزنگاری طراحی نشده است. مهاجمین می توانند ارزش ها را پیش بینی کنند اگر آنها دولت را بشناسند.همیشه از یا Node [FLT36] استفاده کنند.
ذخیره سازی و ورود
هرگز رمز عبور یا کلید تولید نکنید، اگر در ذخیره شده باشید، اطمینان حاصل کنید که سایت بیش از HTTPS خدمت می کند و با استفاده از یک الگوی ذخیره سازی توکن امن (به عنوان مثال، کوکی های Http فقط برای توکن های سمت سرور) در نظر بگیرید.
User ادراک
به طور تصادفی ایجاد رمز عبور اغلب دشوار است به یاد داشته باشید.ارائه دکمه های کپی به داخل صفحه و توصیه کاربران برای استفاده از یک مدیر رمز عبور برای رمز عبور کاربر، در نظر گرفتن تولید passphrases (به عنوان مثال، چهار کلمه تصادفی از یک فرهنگ لغت بزرگ) که ارائه مقایسه با قابلیت حفظ بهتر است.
برنامه های کاربردی و ادغام واقعی
رمز عبور و کلید های جاوا اسکریپت تولید شده در:
- مدیران رمز عبور : بسیاری از مدیران رمز عبور مبتنی بر وب، رمز عبور را در سمت مشتری ایجاد می کنند تا از ارسال دانه به سرور جلوگیری کنند.
- ارائه کلیدی ؛ پانل های مدیریتی کلید های API را برای ادغام های شخص ثالث با استفاده از API های رمزنگاری تولید می کنند.
- ابزار رمزگذاری ؛ خدمات رمزگذاری مشتری، کلید های متقارن و IV تولید می کند.
- کد ها و توکن های یک بار [FLT 1]: تنظیمات احراز هویت دو عاملی اغلب کدهای QR حاوی اسرار تصادفی تولید می کند.
برای خواندن عمیق تر، به مستندات مربوط به رمزنگاری.getRandomValueValues و OWASP Password Storage ورق اشاره کنید.
نتیجه گیری
جاوا اسکریپت ابزار قابل دسترس و قدرتمند برای تولید رمز عبور تصادفی و کلیدهای امن به طور مستقیم در محیط مرورگر یا Node.js فراهم می کند.با درک آنتروپی، با استفاده از API رمزنگاری وب، و پس از بهترین شیوه های امنیتی، توسعه دهندگان می توانند اسرار قوی ایجاد کنند که از داده های کاربر و یکپارچگی برنامه های کاربردی محافظت می کند، با این حال، نسل مشتری تنها یک قطعه از پازل امنیتی است - انتقال مناسب، ذخیره سازی و چرخش به همان اندازه مهم است که رمزگذاری شده است.