مرحبا يا هبر! أقدم إليكم ترجمة المقال 9 من "Java KeyStore" لجاكوب جينكوف من سلسلة من المقالات للمبتدئين الذين يرغبون في تعلم أساسيات التشفير في جافا.
جدول المحتويات:
- تشفير جافا
- تشفير جافا
- MessageDigest
- ماك
- توقيع
- KeyPair
- KeyGenerator
- KeyPairGenerator
- تخزين المفاتيح
- Keytool
- شهادة
- CertificateFactory
- CertPath
تخزين المفاتيح
Java KeyStore هو مخزن مفاتيح على غرار قاعدة البيانات يتم توفيره بواسطة فئة KeyStore ( java.security.KeyStore ). يمكن كتابة وحدة التخزين على القرص وقراءتها مرة أخرى ، ويمكن أن تكون محمية بكلمة مرور ، ويمكن حماية كل سجل مفتاح في مخزن المفاتيح بكلمة مرور خاصة به ، مما يجعل فئة KeyStore
آلية مفيدة للعمل مع مفاتيح التشفير بأمان. يمكن أن يحتوي مفتاح المفاتيح على مفاتيح من الأنواع التالية:
- مفاتيح خاصة
- المفاتيح والشهادات العامة (المفاتيح العامة + الشهادات)
- مفاتيح سرية
يتم استخدام المفاتيح الخاصة والعامة في تشفير غير متماثل. قد يكون لدى المفتاح العمومي شهادة مرتبطة. الشهادة هي وثيقة تثبت هوية شخص أو مؤسسة أو جهاز يدعي امتلاكه لمفتاح عام. وعادة ما يتم توقيع الشهادة رقميا من قبل الطرف المعتمد كدليل. تستخدم المفاتيح الخاصة في تشفير متماثل. في معظم الحالات ، عند إعداد اتصال آمن ، تكون مفاتيح التناظر أقل من تلك غير المتماثلة ، لذلك في أغلب الأحيان ستخزن المفاتيح العامة والخاصة في لوحة المفاتيح.
خلق keystore
يمكنك إنشاء مثيل KeyStore
عن طريق استدعاء الأسلوب getInstance()
. فيما يلي مثال على إنشاء مثيل لفئة:
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
ينشئ هذا المثال مثيل KeyStore
افتراضي. يمكنك أيضًا إنشاء مثيلات KeyStore بتنسيق تخزين مفتاح مختلف عن طريق تمرير معلمة إلى أسلوب getInstance()
. على سبيل المثال ، إنشاء نسخة من PKCS12
keystore:
KeyStore keyStore = KeyStore.getInstance("PKCS12");
تحميل keystore
قبل أن تتمكن من استخدام مثيل من keystore ، يجب عليك تنزيله. غالبًا ما KeyStore
كتابة مثيلات فئة KeyStore
على القرص أو وحدة تخزين أخرى لاستخدامها لاحقًا ، لأن فئة KeyStore
تفترض أنه يجب عليك قراءة بياناتها قبل أن تتمكن من استخدامها. ومع ذلك ، يمكنك تهيئة مثيل KeyStore
فارغ بدون بيانات ، كما سترى لاحقًا.
يتم تحميل البيانات من ملف أو وحدة تخزين أخرى عن طريق استدعاء الأسلوب load()
، والذي يأخذ معلمتين:
InputStream
سيتم تحميل البيانات منه.char[]
مجموعة من الأحرف التي تحتوي على كلمة المرور من لوحة المفاتيح.
فيما يلي مثال على تحميل مفتاح التشغيل:
char[] keyStorePassword = "123abc".toCharArray(); try(InputStream keyStoreData = new FileInputStream("keystore.ks")){ keyStore.load(keyStoreData, keyStorePassword); }
يقوم هذا المثال بتحميل ملف keystore.ks keystore. إذا كنت لا ترغب في تحميل أي بيانات في لوحة المفاتيح ، فكل ما عليك هو تمرير قيمة المعلمة InputStream
. هذه هي الطريقة التي يبدو تحميل keystore فارغة:
keyStore3.load(null, keyStorePassword);
KeyStore
دائمًا تحميل مثيل فئة KeyStore
إما ببيانات أو null
. بخلاف ذلك ، لم تتم تهيئة مفتاح التشغيل ، وستلقي جميع الاستدعاءات بأساليبها استثناءات.
تلقي المفاتيح
يمكنك الحصول على مفاتيح مثيل فئة KeyStore
خلال طريقة getEntry()
. يتم تعيين سجل keystore إلى اسم مستعار يحدد المفتاح وهو محمي بكلمة مرور. وبالتالي ، من أجل الوصول إلى المفتاح ، يجب تمرير الاسم المستعار وكلمة المرور إلى طريقة getEntry()
. فيما يلي مثال على الوصول للكتابة إلى مثيل KeyStore
:
char[] keyPassword = "789xyz".toCharArray(); KeyStore.ProtectionParameter entryPassword = new KeyStore.PasswordProtection(keyPassword); KeyStore.Entry keyEntry = keyStore3.getEntry("keyAlias", entryPassword);
إذا كنت تعرف أن السجل الذي تريد الوصول إليه هو المفتاح الخاص ، فيمكنك تحويل مثيل KeyStore.Entry
إلى KeyStore.PrivateKeyEntry
. إليك ما يبدو عليه:
KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) keyStore3.getEntry("keyAlias", entryPassword);
بعد الإرسال إلى KeyStore.PrivateKeyEntry
يمكنك الوصول إلى سلسلة المفاتيح والشهادات والشهادات الخاصة باستخدام الطرق التالية:
getPrivateKey()
getCertificate()
getCertificateChain()
تخزين المفتاح
يمكنك أيضًا وضع المفاتيح في مثيل فئة KeyStore
. مثال على وضع مفتاح سري (مفتاح متماثل) في مثيل KeyStore
:
SecretKey secretKey = getSecretKey(); KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(secretKey); keyStore3.setEntry("keyAlias2", secretKeyEntry, entryPassword);
تخزين
في بعض الأحيان قد ترغب في حفظ لوحة المفاتيح في نوع من التخزين (القرص ، قاعدة البيانات ، إلخ) بحيث يمكنك تحميله مرة أخرى في وقت آخر. يتم حفظ مثيل لفئة KeyStore
عن طريق استدعاء الأسلوب store()
. مثال:
char[] keyStorePassword = "123abc".toCharArray(); try (FileOutputStream keyStoreOutputStream = new FileOutputStream("data/keystore.ks")) { keyStore3.store(keyStoreOutputStream, keyStorePassword); }