نشانه های وب JSON را بسازید ، امضا و رمزگذاری کنید

ساخت وبلاگ

طبق گفته RFC7519 ، JSON Web Token (JWT) یک وسیله جمع و جور است که از URL ایمن برای نمایش ادعاهایی است که به عنوان یک شیء JSON رمزگذاری می شود که به عنوان بار ساختار امضاء وب JSON (JWS) یا به عنوان متن JSON استفاده می شود. ساختار رمزگذاری وب (JWE) ، این امکان را فراهم می کند که ادعاها به صورت دیجیتالی امضا شوند یا یکپارچگی با کد تأیید اعتبار پیام (MAC) و/یا رمزگذاری شده محافظت شوند.

امضای مطالبات بیشتر برای تأمین مطالبات استفاده می شود. آنچه امروز به عنوان یک توکن JWT شناخته می شود ، به طور معمول با امضای مطالبات در قالب JSON با استفاده از مراحل شرح داده شده در مشخصات امضای وب JSON تولید می شود.

با این حال ، هنگامی که ادعاها حساس هستند ، با پیروی از مراحل شرح داده شده در مشخصات رمزگذاری وب JSON برای تولید یک نشانه JWT با ادعاهای رمزگذاری شده ، محرمانه بودن آنها را می توان تضمین کرد.

سرانجام ، هم محرمانه بودن و هم یکپارچگی مطالبات را می توان با امضای آنها ابتدا و سپس رمزگذاری نشانه JWT تو در تو اجرا کرد.

Smallrye JWT Build API را برای تأمین ادعاهای JWT با استفاده از همه این گزینه ها فراهم می کند. JOSE4J در داخل برای پشتیبانی از این API استفاده می شود.

وابستگی

pom. xml

 io. quarkus quarkus-smallrye-jwt-build 

ساخت.

اجرای ("io. quarkus: quarkus-s-mallrye-jwt-build")

توجه داشته باشید که می توانید از API Smallrye JWT Build Build استفاده کنید بدون اینکه بخواهید نقاط پایانی JWT MicroProfile ایجاد کنید که توسط Quarkus-Smallrye-JWT پشتیبانی می شود. اگر نقاط پایانی MP JWT نیازی به تولید نشانه های JWT نداشته باشد ، می توان آن را از Quarkus-Smallrye-JWT حذف کرد.

JWTClaimsBuilder را ایجاد کنید و ادعاها را تنظیم کنید

اولین قدم اولیه سازی JWTClaimsBuilder با استفاده از یکی از گزینه های زیر و اضافه کردن برخی از ادعاها به آن است:

وارد کردن java. util. collections ؛وارد کردن javax. json. json ؛وارد کردن javax. json. jsonobject ؛وارد کردن io. smallrye. jwt. build. jwt ؛وارد کردن io. smallrye. jwt. build. jwtclaimsbuilder ؛واردات org. eclipse. microprofile. jwt. jsonwebtoken ؛بشر// ایجاد یک سازنده خالی و اضافه کردن برخی از ادعاها jwtclaimsbuilder builder1 = jwt. claims () ؛Builder1. laim ("CustomClaim" ، "Custom-Value") . Issuer ("https://issuer. org") ؛// یا شروع به تایپ مطالبات بلافاصله: // jwtclaimsbuilder builder1 = jwt. upn ("آلیس") ؛// سازنده ایجاد شده از ادعاهای موجود jwtclaimsbuilder builder2 = jwt. claims ("/tokenclaims. json") ؛// سازنده ایجاد شده از نقشه ادعاهای jwtclaimsbuilder builder3 = jwt. claims (collections. singletonmap ("customClaim" ، "Value-Value")) ؛// سازنده ایجاد شده از JsonObject JsonObject نام کاربری = json. createObjectBuilder (). اضافه کنید ("نام کاربری" ، "آلیس"). ساخت () ؛JsonObject userAddress = json. CreateObjectBuilder (). اضافه کنید ("شهر" ، "Somecity"). اضافه کنید ("خیابان" ، "somestreet"). ساخت () ؛jsonobject json = json. createObjectBuilder (نام کاربری) . ADD ("آدرس" ، userAddress) . build () ؛jwtclaimsbuilder builder4 = jwt. claims (json) ؛// سازنده ایجاد شده از jsonwebtoken inject jsonwebtoken token ؛jwtclaimsbuilder builder5 = jwt. claims (توکن) ؛

API مسلط است بنابراین می توان اولیه سازی سازنده را به عنوان بخشی از دنباله API مسلط انجام داد.

سازنده همچنین IAT (صادر شده) را به زمان فعلی ، Exp (منقضی می شود) تا 5 دقیقه با زمان فعلی (می توان آن را با ویژگی Smallrye. jwt. new-token. lifespan) و JTI (منحصر به فرد) تنظیم کرد. شناسه توکن) ادعا می کند اگر قبلاً تنظیم نشده اند.

همچنین می توان smallrye. jwt. new-token. issuer و smallrye. jwt. new-token. Audience را پیکربندی کرد و از تنظیم صادرکننده و مخاطب مستقیماً با API سازنده استفاده کرد.

قدم بعدی تصمیم گیری در مورد چگونگی تأمین ادعاها است.

ادعاها را امضا کنید

ادعاها را می توان بلافاصله یا پس از تنظیم هدرهای امضای وب JSON امضا کرد:

وارد کردن io. smallrye. jwt. build. jwt ؛بشر// ادعاها را با استفاده از یک کلید خصوصی RSA که از محل تنظیم شده با یک ویژگی "smallrye. jwt. sign. key. kocation" بارگیری شده است ، امضا کنید.// انتقال "JWS ()" لازم است. الگوریتم پیش فرض Rs256 است. string jwt1 = jwt. claims ("/tokenclaims. json"). sign () ؛// هدرها را تنظیم کرده و ادعاها را با یک کلید خصوصی RSA که در کد بارگذاری شده است ، امضا کنید (اجرای این روش حذف شده است).// توجه داشته باشید "JWS ()" انتقال به "JWtSignatureBuilder" ، الگوریتم پیش فرض Rs256 است. string jwt2 = jwt. claims ("/tokenclaims. json"). jws (). keyid ("kid1"). header ("header custom" ، "custom-value"). sign (getPrivateKey ()) ؛

توجه داشته باشید که هدر Alg (الگوریتم) به طور پیش فرض روی Rs256 تنظیم شده است. در صورت استفاده از یک کلید وب JSON (JWK) حاوی خاصیت کودک ، لازم نیست که شناسه کلید (Kid Header) تنظیم شود.

کلیدهای خصوصی RSA و بیضوی (EC) و همچنین از کلیدهای مخفی متقارن برای امضای ادعاها می توان استفاده کرد. ES256 و HS256 به ترتیب الگوریتم های پیش فرض الگوریتم های کلید خصوصی و متقارن EC هستند.

به عنوان مثال می توانید الگوریتم امضا را سفارشی کنید:

وارد کردن io. smallrye. jwt. signaturealgorithm ؛وارد کردن io. smallrye. jwt. build. jwt ؛// ادعاها را با استفاده از یک کلید خصوصی RSA که از محل تنظیم شده با یک ویژگی "smallrye. jwt. sign. key. kocation" بارگیری شده است ، امضا کنید. الگوریتم PS256 است. string jwt = jwt. upn ("آلیس"). jws (). الگوریتم (signaturealgorithm. ps256) . sign () ؛

از طرف دیگر می توانید از یک خاصیت smallrye. jwt. new-token. signature-algorithm استفاده کنید:

smallrye. jwt. new-token. signature- algorithm = ps256

و یک دنباله API ساده تر بنویسید:

وارد کردن io. smallrye. jwt. build. jwt ؛// ادعاها را با استفاده از یک کلید خصوصی RSA که از محل تنظیم شده با یک ویژگی "smallrye. jwt. sign. key. kocation" بارگیری شده است ، امضا کنید. الگوریتم PS256 است. رشته jwt = jwt. upn ("آلیس"). علامت () ؛

توجه داشته باشید که مرحله علامت را می توان با مرحله رمزگذاری برای تولید نشانه های امضا شده و رمزگذاری شده داخلی ترکیب کرد ، به امضاء ادعاها و رمزگذاری بخش توکن JWT تو در تو در تو در توجیه کنید.

ادعاها را رمزگذاری کنید

این ادعاها را می توان بلافاصله یا بعد از اینکه هدرهای رمزگذاری وب JSON به همان روشی که می توان امضا کرد ، رمزگذاری کرد. تنها تفاوت جزئی در این است که رمزگذاری ادعاها همیشه نیاز به انتقال JWE () JWTencryPtionBuilder با توجه به اینکه API برای پشتیبانی از امضای و امضای درونی مطالبات بهینه شده است.

وارد کردن io. smallrye. jwt. build. jwt ؛بشر// ادعاها را با استفاده از یک کلید عمومی RSA که از محل تنظیم شده با یک ویژگی "smallrye. jwt. encrypt. key. location" بارگیری شده است ، رمزگذاری کنید. الگوریتم رمزگذاری کلید پیش فرض RSA-OAEP است. string jwt1 = jwt. claims ("/tokenclaims. json"). jwe (). رمزگذاری () ؛// هدرها را تنظیم کرده و ادعاها را با یک کلید عمومی RSA بارگذاری شده در کد رمزگذاری کنید (اجرای این روش حذف شده است). الگوریتم رمزگذاری کلید پیش فرض A256KW است. string jwt2 = jwt. claims ("/tokenclaims. json"). jwe (). header ("رهبر سفارشی" ، "ارزش سفارشی"). رمزگذاری (getSecretKey ()) ؛

توجه داشته باشید که عنوان ALG (الگوریتم مدیریت کلید) روی RSA-OAEP تنظیم شده است و ENC (هدر رمزگذاری محتوا) به طور پیش فرض روی A256GCM تنظیم شده است.

کلیدهای عمومی RSA و بیضوی (EC) و همچنین از کلیدهای مخفی متقارن برای رمزگذاری ادعاها استفاده می شوند. ECDH-ES و A256KW الگوریتم های پیش فرض الگوریتم های رمزگذاری کلید عمومی و متقارن به ترتیب هستند.

توجه داشته باشید دو عمل رمزگذاری هنگام ایجاد یک نشانه رمزگذاری شده انجام می شود:

1) کلید رمزگذاری محتوای تولید شده توسط کلید تهیه شده با API با استفاده از الگوریتم رمزگذاری کلید مانند RSA-OAEP 2 رمزگذاری می شود) ادعاها توسط کلید رمزگذاری محتوای تولید شده با استفاده از الگوریتم رمزگذاری محتوا مانند A256GCM رمزگذاری می شوند.

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

وارد کردن io. smallrye. jwt. keyencryptionalgorithm ؛وارد کردن io. smallrye. jwt. contentencryptionalgorithm ؛وارد کردن io. smallrye. jwt. build. jwt ؛// ادعاها را با استفاده از یک کلید عمومی RSA که از محل تنظیم شده با یک ویژگی "smallrye. jwt. encrypt. key. location" بارگیری شده است ، رمزگذاری کنید.// الگوریتم رمزگذاری کلید RSA-OAEP-256 است ، الگوریتم رمزگذاری محتوا A256CBC-HS512 است. string jwt = jwt. subject ("bob"). jwe () . keyalgorithm (keyencryptionalgorithm. rsa_oaep_256) . contentalgorithm (consentencryptionalgorithm. a256cbc_hs512) . encrypt () ؛

از طرف دیگر می توانید از خصوصیات Smallrye. jwt. new-token. Key-Ancryption-Algorithm و smallrye. jwt. new-token. content- الگوریتم برای سفارشی کردن الگوریتم های رمزگذاری کلید و محتوا استفاده کنید:

smallrye. jwt. new-token. key- الگوریتم = RSA-OAEP-256 smallrye. jwt. new-token. content- الگوریتم = A256CBC-HS512

و یک دنباله API ساده تر بنویسید:

وارد کردن io. smallrye. jwt. build. jwt ؛// ادعاها را با استفاده از یک کلید عمومی RSA که از محل تنظیم شده با یک ویژگی "smallrye. jwt. encrypt. key. location" بارگیری شده است ، رمزگذاری کنید.// الگوریتم رمزگذاری کلید RSA-OAEP-256 است ، الگوریتم رمزگذاری محتوا A256CBC-HS512 است. string jwt = jwt. subject ("bob"). رمزگذاری () ؛

توجه داشته باشید که هنگامی که توکن به طور مستقیم توسط کلید RSA یا EC عمومی رمزگذاری می شود ، نمی توان تأیید کرد که کدام طرف توکن را ارسال کرده است. بنابراین ، کلیدهای مخفی باید برای رمزگذاری مستقیم نشانه ها ترجیح داده شوند ، به عنوان مثال ، هنگام استفاده از JWT به عنوان کوکی هایی که یک کلید مخفی توسط نقطه انتهایی Quarkus اداره می شود و تنها این نقطه پایانی هم تولید کننده و هم مصرف کننده رمزگذاری شده است.

اگر مایل به استفاده از کلیدهای عمومی RSA یا EC برای رمزگذاری این نشانه هستید ، در صورت وجود کلید امضای ، توصیه می شود که ابتدا نشانه را امضا کنید ، به علامت بعدی ادعاها مراجعه کنید و بخش توکن JWT را رمزگذاری کنید.

ادعاها را امضا کرده و نشانه JWT تو در تو را رمزگذاری کنید

این ادعاها را می توان امضا کرد و سپس نشانه JWT تو در تو در تو در توجیه با ترکیب علائم و مراحل رمزگذاری شده رمزگذاری شد.

وارد کردن io. smallrye. jwt. build. jwt ؛بشر// ادعاها را امضا کرده و نشانه های توخالی را با استفاده از کلیدهای خصوصی و عمومی که از مکان های تعیین شده با "smallrye. jwt. sign. key. kocation" و "smallrye. jwt. encrypt. key. kocation" به ترتیب رمزگذاری شده است ، رمزگذاری کنید. الگوریتم امضاء RS256 است ، الگوریتم رمزگذاری کلید RSA-OAEP-256 است. string jwt = jwt. claims ("/tokenclaims. json"). iersign (). رمزگذاری () ؛

نسل سریع JWT

اگر smallrye. jwt. sign. key. location یا/و smallrye. jwt. encrypt. key. location تنظیم شده است ، می توان ادعاهای موجود (منابع ، نقشه ها ، jsonobjects) را با یک تماس واحد تضمین کرد:

// جمع و جور تر از jwt. claims ("/Idea. json"). sign () ؛jwt. sign ("/Idea. json") ؛// جمع و جور تر از jwt. claims ("/Idea. json"). jwe (). رمزگذاری () ؛jwt. encrypt ("/Idea. json") ؛// جمع و جور تر از jwt. claims ("/Idea. json"). Iersign (). رمزگذاری () ؛jwt. signandencrypt ("/Idea. json") ؛

همانطور که در بالا ذکر شد ، IAT (صادر شده در) ، EXP (منقضی می شود) ، JTI (شناسه توکن) ، ISS (صادرکننده) و AUD (مخاطب) در صورت لزوم اضافه می شوند.

برخورد با کلیدها

smallrye. jwt. sign. key. location and smallrye. jwt. encrypt. key. location می تواند برای اشاره به مکان های کلیدی امضای و رمزگذاری استفاده شود. کلیدها را می توان در سیستم فایل محلی ، ClassPath یا از نقاط پایانی از راه دور قرار داد و می تواند در قالب های PEM یا JSON Web Key (JWK) باشد. مثلا:

smallrye. jwt. sign. key = privatekey. pem smallrye. jwt. encrypt. key = publicKey. pem

همچنین می توانید از MicroProfile ConfigSource برای واکشی کلیدهای خدمات خارجی مانند طاق Hashicorp یا سایر مدیران مخفی استفاده کنید و به جای آن از ویژگی های Smallrye. jwt. sign. key و smallrye. jwt. encrypt. key استفاده کنید:

smallrye. jwt. sign. key = $ smallrye. jwt. encrypt. key = $

در جایی که هر دو private. key. from. vault و public. key. from. vault مقادیر کلیدی فرمت شده PEM یا JWK ارائه شده توسط Confuent ConfigSource هستند. smallrye. jwt. sign. key و smallrye. jwt. encrypt. key همچنین می تواند فقط حاوی مقادیر کلیدهای خصوصی یا عمومی رمزگذاری شده با پایه 64 باشد.

با این حال ، لطفاً توجه داشته باشید که مستقیماً کلیدهای خصوصی در پیکربندی توصیه نمی شود. فقط در صورت نیاز به واکشی مقدار کلید امضاء از مدیر مخفی از راه دور ، از ویژگی Smallrye. jwt. sign. key استفاده کنید.

کلیدها را می توان با کدی که نشانه را ایجاد کرده و به JWT Build API تهیه کرده است ، بارگیری کرد.

در صورت نیاز به امضا و/یا رمزگذاری با استفاده از کلید مخفی متقارن ، پس از آن با استفاده از io. smallrye. jwt. util. keyutils در نظر بگیرید تا یک منبع رانده طول مورد نیاز ایجاد کنید.

به عنوان مثال ، باید با استفاده از الگوریتم HS512 (512/8) و یک کلید 32 بایت برای رمزگذاری کلید رمزگذاری محتوا با الگوریتم A256KW (256/8) ، یک کلید بایت 64 بایت داشته باشد:

وارد کردن javax. crypto. secretkey ؛وارد کردن io. smallrye. jwt. keyencryptionalgorithm ؛وارد کردن io. smallrye. jwt. signaturealgorithm ؛وارد کردن io. smallrye. jwt. build. jwt ؛وارد کردن io. smallrye. jwt. util. keyutils ؛Secretkey SigningKey = keyutils. generatesecretkey (signaturealgorithm. hs512) ؛Secretkey EncryptionKey = keyutils. generatesecretkey (keyencryptionalgorithm. a256kw) ؛string jwt = jwt. laim ("SensitiveClam" ، getSensitiveClaim ()). iersign (امضای کلید) . encrypt (رمزگذاری کلید) ؛

همچنین می توانید با استفاده از فرمت JSON Web Key (JWK) یا JSON Web Key Set (JWK Set) برای ذخیره یک کلید مخفی در یک سیستم فایل ایمن در نظر بگیرید و با استفاده از آن با استفاده از smallrye. jwt. sign. key. location یا smallrye به آن مراجعه کنید. به عنوان مثال ویژگی های JWT. Encrypt. Key. Location:

استراتژی‌های اسکالپ...
ما را در سایت استراتژی‌های اسکالپ دنبال می کنید

برچسب : نویسنده : ناصر تقوایی بازدید : <-PostHit-> تاريخ : جمعه 6 مرداد 1402 ساعت: 22:04