تولید کلید مخفی JWT
کلید امن HS256/HS384/HS512 و جفتکلید RSA/ECDSA — تولیدشده با Web Crypto API، کاملاً در مرورگر شما.
کلیدها با crypto.getRandomValues و روی دستگاه خودتان ساخته میشوند. هیچ درخواستی به سرور نمیرود، هیچ کلیدی ذخیره یا لاگ نمیشود و با بستن صفحه از حافظه پاک میشود — فقط تنظیمات (نه خود کلید) برای دفعهٔ بعد نگه داشته میشود.
الگوریتم امضا
الگوریتم، حداقل طول مجاز کلید را تعیین میکند (RFC 7518).
ساختار کلید
«بایت تصادفی» کلید را از خروجی خام crypto.getRandomValues میسازد و بیشترین آنتروپی را در هر بایت دارد — گزینهٔ توصیهشده. «رشتهٔ ASCII» کلیدی خوانا و قابل تایپ میسازد که در فایلهای پیکربندی دردسر انکدینگ ایجاد نمیکند.
برای چرخش کلید (key rotation) دو کلید بسازید: فعال و بعدی.
این ابزار چیست؟
کلید مخفی JWT همان چیزی است که امضای توکنهای احراز هویت شما را معتبر نگه میدارد؛ اگر این کلید ضعیف یا قابل حدس باشد، مهاجم میتواند توکن دلخواه خودش را بسازد و بهجای هر کاربری وارد سامانه شود. ابزار تولید کلید مخفی JWT در BaseTools این کلید را با Web Crypto API و مولد اعداد تصادفی امن مرورگر (crypto.getRandomValues) میسازد — بدون هیچ درخواستی به سرور، بدون ذخیرهسازی و بدون لاگ. میتوانید الگوریتم HS256، HS384 یا HS512 را انتخاب کنید و ابزار بهطور خودکار بررسی میکند که طول کلید، حداقل الزام RFC 7518 (کلید دستکم به اندازهٔ خروجی هش) را برآورده کند. طول کلید از ۳۲ تا ۵۱۲ بیت قابل تنظیم است و خروجی را میتوانید در قالبهای Base64، Base64URL، Hex، JWK یا آرایهٔ بایت بگیرید. فراتر از یک تولیدکنندهٔ ساده، این ابزار جفتکلید نامتقارن RSA و ECDSA با خروجی PEM و سند JWKS میسازد، یک آزمایشگاه دارد که با کلید شما یک توکن واقعی امضا و اعتبارسنجی میکند، کلیدهای فعلی پروژهتان را از نظر آنتروپی و حضور در فهرست کلیدهای لورفته بازرسی میکند و کد آمادهٔ پیکربندی را برای Node.js، NestJS، jose، Python، Go، Laravel، Spring Boot، Docker و Kubernetes در اختیارتان میگذارد.
چطور استفاده کنیم؟
- الگوریتم امضا (HS256، HS384 یا HS512) را متناسب با کتابخانهٔ سمت سرور خود انتخاب کنید.
- ساختار کلید را مشخص کنید: «بایت تصادفی» برای بیشترین آنتروپی یا «رشتهٔ ASCII» برای کلیدی خوانا و قابل تایپ.
- طول کلید را تنظیم کنید؛ برای HS256 حداقل ۲۵۶ بیت، برای HS384 حداقل ۳۸۴ بیت و برای HS512 حداقل ۵۱۲ بیت لازم است.
- روی «تولید کلید جدید» بزنید (یا کلید میانبر Ctrl+G) و قالب خروجی دلخواه — Base64، Hex، JWK و… — را انتخاب و کپی کنید.
- از تب «کد فریمورک» پیکربندی آمادهٔ استک خود را بردارید و کلید را در متغیر محیطی (نه داخل کد) قرار دهید.
مزایای استفاده از این ابزار
- تولید کلید با Web Crypto API و مولد تصادفی امن مرورگر — بدون ارسال به سرور
- پشتیبانی کامل از HS256، HS384 و HS512 با اعتبارسنجی خودکار حداقل طول کلید طبق RFC 7518
- طول کلید قابل تنظیم از ۳۲ تا ۵۱۲ بیت با نمایش آنتروپی و زمان تخمینی شکستن
- خروجی در قالبهای Base64، Base64URL، Hex، JWK و آرایهٔ بایت
- تولید جفتکلید نامتقارن RSA (RS/PS) و ECDSA (ES) با خروجی PEM و سند JWKS
- آزمایشگاه توکن: امضا و اعتبارسنجی واقعی JWT با کلید تولیدشده، همانجا در مرورگر
- بازرسی امنیتی کلیدهای موجود با امتیازدهی، تشخیص الگوی تکراری و کلیدهای رایج لورفته
- کد آمادهٔ Node.js، NestJS، jose، Python، Go، Laravel، Spring، Docker Compose و Kubernetes Secret
- پشتیبانی از چرخش کلید (key rotation) با شناسهٔ kid و سند JWKS دوکلیدی
سوالات متداول
طول کلید JWT چقدر باید باشد؟
طبق RFC 7518، کلید HMAC باید دستکم به اندازهٔ خروجی تابع هش باشد: ۲۵۶ بیت (۳۲ بایت) برای HS256، ۳۸۴ بیت برای HS384 و ۵۱۲ بیت برای HS512. کلید کوتاهتر از این مقدار را کتابخانههای استاندارد مانند jose رد میکنند و امنیت امضا را تضعیف میکند. توصیهٔ ما ۲۵۶ بیت یا بیشتر است؛ این ابزار هر وقت کلید زیر حد مجاز باشد به شما هشدار میدهد.
آیا کلید تولیدشده واقعاً امن است؟
بله. کلیدها با crypto.getRandomValues ساخته میشوند که مولد اعداد تصادفی امن رمزنگاری (CSPRNG) خود مرورگر است — نه Math.random که برای رمزنگاری کاملاً نامناسب است. در حالت رشتهٔ ASCII هم برای جلوگیری از سوگیری آماری از روش rejection sampling استفاده میشود تا همهٔ کاراکترها شانس یکسان داشته باشند.
آیا کلید من به سروری ارسال میشود؟
خیر. تمام پردازش صد درصد در مرورگر شما انجام میشود؛ هیچ درخواست شبکهای برای تولید کلید فرستاده نمیشود. کلیدها حتی در حافظهٔ محلی (localStorage) هم ذخیره نمیشوند و با بستن یا نوسازی صفحه از بین میروند — فقط تنظیمات ابزار (مثل الگوریتم و طول انتخابی) نگه داشته میشود. میتوانید صفحه را باز کنید، اینترنت را قطع کنید و همچنان کلید بسازید.
تفاوت HS256 با RS256 چیست و کدام را انتخاب کنم؟
در HS256 یک کلید متقارن هم برای امضا و هم برای بررسی امضا استفاده میشود؛ ساده و سریع است و برای وقتی که همان سرویسی که توکن را میسازد آن را بررسی هم میکند، انتخاب درستی است. در RS256 (و ES256) یک جفتکلید دارید: کلید خصوصی فقط نزد صادرکنندهٔ توکن میماند و کلید عمومی را میتوانید آزادانه بین سرویسها پخش کنید. اگر معماری میکروسرویسی دارید یا شخص ثالثی باید توکنهای شما را اعتبارسنجی کند، RS256 یا ES256 امنتر است — از تب «جفتکلید» همین ابزار بسازیدشان.
کلید مخفی را کجا نگه دارم؟
هرگز کلید را داخل کد یا مخزن گیت قرار ندهید. آن را در متغیر محیطی (فایل .env که در .gitignore است)، یا بهتر از آن در یک سرویس مدیریت راز مانند Kubernetes Secret، AWS Secrets Manager، HashiCorp Vault یا Doppler نگه دارید. همچنین کلید محیط توسعه و پروداکشن باید متفاوت باشند و کلید را بهصورت دورهای (مثلاً هر چند ماه) بچرخانید.
چرخش کلید (Key Rotation) را چطور بدون قطعی انجام دهم؟
تعداد کلید را روی ۲ بگذارید تا یک کلید «فعال» و یک کلید «بعدی» بسازید. هر کلید یک شناسهٔ kid یکتا دارد که در header توکن قرار میگیرد. در بازهٔ چرخش، سرویس اعتبارسنجی هر دو کلید را میپذیرد (بر اساس kid توکن) ولی امضای توکنهای جدید فقط با کلید فعال انجام میشود؛ پس از انقضای همهٔ توکنهای قدیمی، کلید قبلی را حذف میکنید. سند JWKS دوکلیدی آمادهٔ همین کار در تب «کد فریمورک» موجود است.
حملهٔ alg=none چیست و چطور جلویش را بگیرم؟
اگر سرور شما الگوریتم را از خودِ header توکن بخواند، مهاجم میتواند alg را روی none یا یک الگوریتم ضعیفتر بگذارد و امضا را دور بزند. راهحل ساده است: هنگام اعتبارسنجی همیشه فهرست الگوریتمهای مجاز را صریح بدهید (مثلاً algorithms: ['HS256']). تمام نمونهکدهای این ابزار از قبل با همین تنظیم امن نوشته شدهاند.