(JWE) طريقة استخدام "تشفير الويب" على JSON
يمكن استخدام تشفير الويب JSON (JWE) عندما يحتاج المرء إلى
إضافة معلومات حساسة إلى رمز مميز لا يرغب المرء في مشاركته مع أنظمة أخرى.
في المقالة السابقة ، نظرنا في رموز ويب JSON الموقعة وكيفية استخدامها
للحصول على تفويض عبر الخدمات. لكن في بعض الأحيان ، هناك مواقف تحتاج
فيها إلى إضافة معلومات حساسة إلى رمز مميز لا ترغب في مشاركته مع أنظمة أخرى.
أو يمكن إعطاء هذا الرمز لجهاز المستخدم (المتصفح ، الهاتف). في هذه الحالة ،
يمكن للمستخدم فك شفرة الرمز والحصول على جميع المعلومات من الحمولة.
يمكن أن يكون أحد الحلول لمثل هذه المشكلة هو استخدام JSON Web Encryption
(JWE) ، والتي يمكن العثور على المواصفات الكاملة لها في RFC7516 .
طريقة تشفير الويب JSON (JWE)
JWE هو إصدار مشفر من JWT ويبدو كالتالي:
Encoded Token 559 bytes)
eyJhbGcioi JSUOE t TOFFUCOyNTYiLCJ0eXAi0i J KV1Qi LC
31bmMi0i3BMjU2RONNIne. mzHayN2 csEwRHOQh LvzBChYY
wU-XY7PKYQI 3BHwCxhxubx09ks t KBkhIkJu7egz51AWOA9
kxe6HpEuv6wxQBndOThR- 74uxZvo-ZRv4c2hgxmt tAl1YY
EBUQVqnBStpPh .....
يتكون من الأجزاء التالية مفصولة بنقطة:
BASE64URL(UTF8(JWE Protected Header)) || '.' ||
BASE64URL(JWE Encrypted Key) || '.' ||
BASE64URL(JWE Initialization Vector) || '.' ||
BASE64URL(JWE Ciphertext) || '.' ||
BASE64URL(JWE Authentication Tag)
هيدر JWE المحمي
علي سبيل المثال:
{
"enc": "A256GCM",
"alg": "RSA-OAEP-256"
}
أين تكتب JWE
1- alg-
يتم تشفير مفتاح تشفير المحتوى للمستلم باستخدام خوارزمية
RSAES-OAEP لإنتاج مفتاح JWE المشفر.
2- enc-
يتم إجراء التشفير المصدق على النص العادي باستخدام خوارزمية AES GCM مع
مفتاح 256 بت لإنتاج النص المشفر وعلامة الاستيقان.
- مفتاح JWE المشفر
قيمة مفتاح تشفير المحتوى المشفر.
- ناقل تهيئة JWE
القيمة التي يتم إنشاؤها عشوائيًا اللازمة لعملية التشفير.
- JWE Ciphertext
حمولة مشفرة.
- علامة مصادقة JWE
تُحسب أثناء عملية التشفير وتُستخدم للتحقق من النزاهة.
جيل رمزي "Token Generation"
هناك العديد من المكتبات للعديد من لغات البرمجة للعمل مع رموز JWE. لنفكر كمثال في مكتبة Nimbus.
build.gradle:
implementation 'com.nimbusds:nimbus-jose-jwt:9.25.6'
يمكن تمثيل الحمولة كمجموعة من المطالبات:
{
"sub": "alice",
"iss": "https://idp.example.org",
"exp": 1669541629,
"iat": 1669541029
}
لنقم بإنشاء رأس:
جافا
JWEHeader header = new JWEHeader(
JWEAlgorithm.RSA_OAEP_256,
EncryptionMethod.A256GCM
);
والذي يتوافق مع JSON التالي :
{
"enc": "A256GCM",
"alg": "RSA-OAEP-256"
}
لنقم بإنشاء مفتاح RSA:
جافا
RSAKey rsaJwk = new RSAKeyGenerator(2048)
.generate();
باستخدام الجزء العام من المفتاح ، يمكننا إنشاء كائن Encrypter ، حيث نقوم بتشفير JWT:
جافا
RSAEncrypter encrypter = new RSAEncrypter(rsaJwk.toRSAPublicKey());
EncryptedJWT jwt = new EncryptedJWT(header, jwtClaims);
String jweString = jwt.encrypt(encrypter);
نتيجة التنفيذ:
eyJlbmMiOiJBMjU2R0NNIiwiYWxnIjoiUlNBLU9BRVAtMjU2In0.O01BFr_XxGzKEUb_Z9vQOW3DX2cQFxojrRy2JyM5_nqKnrpAa0rvcPI_ViT2PdPRogBwjHGRDM2uNLd1BberKQlaZYuqPGXnpzDQjosF0tQlgdtY3uEZUMT-9WPP8jCxxQg0AGIm4abkp1cgzAWBQzm1QYL8fwaz16MS48ExRz41dLhA0aEWE4e7TYzjrfaK8M4wIUlQCFIl-wS1N3U8W2XeUc9MLYGmHft_Rd9KJs1c-9KKdUQf6tEzJ92TGEC7TRZX4hGdtszIq3GGGBQaW8P9jPozqaDdrikF18D0btRHNf3_57sR_CPEGYX0O4mY775CLWqB4Y1adNn-fZ0xoA.ln7IYZDF9TdBIK6i.ZhQ3Q5TY827KFQw8DdRRzQVJVFdIE03B6AxMNZ1sQIjlUB4QUxg-UYqjPJESPUmFsODeshGWLa5t4tUri5j6uC4mFDbkbemPmNKIQiY5m8yc.5KKhrggMRm7ydVRQKJaT0g
لفك تشفير رمز JWE ، تحتاج إلى إنشاء كائن Decryptor وتمرير الجزء الخاص من المفتاح إليه:
جافا
EncryptedJWT jwt = EncryptedJWT.parse(jweString);
RSADecrypter decrypter = new RSADecrypter(rsaJwk.toPrivateKey());
jwt.decrypt(decrypter);
Payload payload = jwt.getPayload();
هنا ، استخدمنا خوارزمية تشفير غير متماثل - يتم استخدام الجزء العام
من المفتاح للتشفير ، والجزء الخاص لفك التشفير. يسمح هذا الأسلوب بإصدار رموز
JWE لخدمات الجهات الخارجية والتأكد من حماية البيانات (عندما يكون
هناك وسطاء في مسار إرسال الرمز المميز). في هذه الحالة ، تحتاج الخدمة
النهائية إلى نشر المفاتيح العامة ، والتي سنستخدمها لتشفير محتوى الرمز المميز.
لفك تشفير الرمز المميز ، ستستخدم الخدمة الجزء الخاص من المفتاح ، والذي سيبقى سراً.
ولكن ماذا لو كان لدينا نفس المصدر وخدمة رمز المستهلك؟ يمكن أن تكون
خلفية تقوم بتعيين ملف تعريف ارتباط في متصفح المستخدم بمعلومات حساسة.
في هذه الحالة ، لن تحتاج إلى استخدام خوارزمية غير متماثلة - يمكنك استخدام خوارزمية متماثلة.
في مصطلحات JWE ، هذا هو تشفير مباشر:
جافا
JWEHeader header = new JWEHeader(JWEAlgorithm.DIR, EncryptionMethod.A128CBC_HS256);
والذي يتوافق مع JSON التالي:
{
"enc": "A128CBC-HS256",
"alg": "dir"
}
لنقم بإنشاء مفتاح 256 بت:
جافا
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(256);
SecretKey key = keyGen.generateKey();
وتشفير JWT:
جافا
JWEObject jweObject = new JWEObject(header, jwtClaims.toPayload());
jweObject.encrypt(new DirectEncrypter(key));
String jweString = jweObject.serialize()
نتيجة التنفيذ:
eyJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiYWxnIjoiZGlyIn0..lyJ_pcHfp8cz13TVav8MZQ.LmeN4jHxYg-dEFZ98PlVfNXFI29L5NGanA6ncALWcI9uDqpoXaaBcKeOKuzRayfQ3X7yPTuiMRHAUHMR5K3Rucmb8fQw2dkP3EONUg0lbdbmfbNwDbjQcWCGUWXfBWFg.v63pTlB7B15ZLEwSBwBUAg
لاحظ أن التشفير المباشر لا يشمل جزء JWE المشفر من الرمز المميز.
لفك تشفير الرمز المميز ، تحتاج إلى إنشاء Decryptor من نفس المفتاح:
جافا
EncryptedJWT jwt = EncryptedJWT.parse(jweString);
jwt.decrypt(new DirectDecrypter(key));
Payload payload = jwt.getPayload();
أداء التشفير JSON
لتقييم أداء خوارزميات التشفير المتماثل وغير المتماثل ، تم إجراء معيار باستخدام مكتبة JHM.
تم اختيار RSA_OAEP_256 / A256GCM كخوارزمية غير متماثلة ،
A128CBC_HS256 كخوارزمية متماثلة. تم إجراء الاختبارات على جهاز Macbook Air M1.
الحمولة:
{
"iss": "https://idp.example.org",
"sub": "alice",
"exp": 1669546229,
"iat": 1669545629
}
نتائج المعيار:
Benchmark Mode Cnt Score Error Units
Asymmetric Decrypt thrpt 4 1062,387 ± 4,990 ops/s
Asymmetric Encrypt thrpt 4 17551,393 ± 388,733 ops/s
Symmetric Decrypt thrpt 4 152900,578 ± 1251,034 ops/s
Symmetric Encrypt thrpt 4 122104,824 ± 5102,629 ops/s
Asymmetric Decrypt avgt 4 0,001 ± 0,001 s/op
Asymmetric Encrypt avgt 4 ≈ 10⁻⁴ s/op
Symmetric Decrypt avgt 4 ≈ 10⁻⁵ s/op
Symmetric Encrypt avgt 4 ≈ 10⁻⁵ s/op
كما هو متوقع ، تكون الخوارزميات غير المتماثلة أبطأ. وفقا لنتائج الاختبار ،
أبطأ أكثر من عشر مرات. وبالتالي ، إذا أمكن ، يجب تفضيل الخوارزميات المتماثلة لزيادة الأداء.
الخلاصة:
تعد الرموز المميزة لـ JWE أداة قوية جدًا وتسمح لك بحل المشكلات
المتعلقة بنقل البيانات الآمن مع الاستفادة من جميع مزايا الرموز المميزة المستقلة.
في الوقت نفسه ، من الضروري الانتباه إلى مشكلات الأداء واختيار الخوارزمية الأنسب وطول المفتاح.