التشفير في جافا. KeyStore الدرجة

مرحبا يا هبر! أقدم إليكم ترجمة المقال 9 من "Java KeyStore" لجاكوب جينكوف من سلسلة من المقالات للمبتدئين الذين يرغبون في تعلم أساسيات التشفير في جافا.


جدول المحتويات:


  1. تشفير جافا
  2. تشفير جافا
  3. MessageDigest
  4. ماك
  5. توقيع
  6. KeyPair
  7. KeyGenerator
  8. KeyPairGenerator
  9. تخزين المفاتيح
  10. Keytool
  11. شهادة
  12. CertificateFactory
  13. 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); } 

Source: https://habr.com/ru/post/ar445786/


All Articles