محرر نصوص متعدد المستخدمين بسيط مع تشفير من طرف إلى طرف

مقدمة


اليوم ، يعد أمن المعلومات أحد أولويات صناعة تكنولوجيا المعلومات ، خاصة بالنظر إلى أنه من أجل الاستماع إلى حركة المرور في عصرنا ، فأنت لا تحتاج عملياً إلى معرفة متخصصة - فهناك على الإنترنت ما يكفي من البرامج والأدلة التفصيلية.

لذلك ، قمت بتعيين مشكلة كتابة خدمة وحلها من أجل تبادل الملفات المصممة بحيث تكون محمية إلى أقصى حد من هجمات "رجل في الوسط" - يجب ألا تنتقل الملفات المرسلة عبر الخدمة من بطاقة الشبكة الخاصة بالجهاز النهائي في شكل غير مشفر ، فك التشفير ، وفقا لذلك ، كان يجب أن يحدث على آلة المتلقي النهائي.

اختيار الأداة


لكتابة جانب الخادم للتطبيق ، اخترت لغة برمجة Java مع إطار تطوير شبكة Wicket. ليست هذه هي مجموعة الأدوات الوحيدة التي كان من الممكن تنفيذ المهام عليها ، ولكن هذه المجموعة كافية تمامًا لحلها ، وتوفر Wicket ، من بين أشياء أخرى ، واجهة مريحة للغاية للعمل مع مكونات صفحة الويب. لم تتضمن الواجهة الأمامية وجود شيء معقد فيه - لم أضع نفسي على عاتقي مهمة تطوير واجهة جميلة وودية ، كان منطق التطبيق يمثل أولوية عليا ، لذا حصرت نفسي في حزمة HTML / CSS / JS الكلاسيكية.

يتم تشغيل الخادم على Ubunty 18.04 ، في حاوية Docker - ولكن ستتم مناقشة تكوين الخادم بمزيد من التفاصيل أدناه - باستخدام حاوية apache Tomcat servlet. سيتم ذكر التقنيات الأخرى اللازمة لبناء مثل هذا التطبيق ، إذا لزم الأمر ، خلال المقال.

تكوين الخادم


كما ذكرنا سابقًا ، يوجد التطبيق على خادم linux ، على وجه الخصوص ، على Ubunty 18.04. من أجل عزل النظام عن التطبيقات الأخرى ، بالإضافة إلى تبسيط عملية النشر ، تقرر نقل العملية إلى حاوية - بمساعدة Doker ، خصص للتطبيق كمية معينة من وحدة المعالجة المركزية والذاكرة وقائمة المنافذ المفتوحة وأغلق الباقي. لن أصف بالتفصيل تركيب وتكوين خدمة Docker ، لكن يجب أن أذكر النقاط الرئيسية.

من المفترض أن يتم تنفيذ جميع الأوامر بامتيازات المسؤول.

للبدء ، كان مطلوبًا تثبيت الخدمة المقابلة وبدء تشغيلها باستخدام الأوامر

# apt install docker-e # systemctl start docker # systemctl enable docker 

بعد ذلك ، قم بتنزيل وتشغيل صورة نظام التشغيل - لسنا بحاجة إلى أي شيء أكثر من الحاوية في الوقت الحالي:

 #docker search ubuntu #docker pull ubuntu #docker run -it ubuntu 

يجب أن يتغير نمط موجه الإدخال - الآن نحن في الحاوية ويمكننا العمل دون خوف على البيئة الحقيقية. ربما سيتم تفويت بعض الحزم التي اعتدنا عليها على جهاز حقيقي في الحاوية ، لكن الإجراء الخاص بتثبيتها لا يختلف عن تثبيت حزمة على جهاز حقيقي ، لذلك لن أركز على ذلك. من المفترض كذلك أن جميع الإجراءات يتم تنفيذها داخل الحاوية.

تكوين حاوية Tomcat Servlet


لذلك ، في الوقت الحالي ، نفترض أننا نعمل على نظام تشغيل نظيف ، حيث يكون كل شيء افتراضيًا. لتتمكن من استضافة تطبيق Java عليه ، تحتاج إلى تثبيت jdk و jvm مباشرة عليه ، وتعيين متغيرات البيئة باستخدام مسارات التثبيت. وفقًا لذلك ، سأقدم هنا الأوامر الرئيسية فقط ، بمزيد من التفصيل ، يمكن اعتبار عملية تثبيت Java على Linux على الشبكة.

لتثبيت JDK و JRE ، ثم ضبط متغير البيئة JAVA_HOME ، تحتاج إلى إدخال هذه الأوامر وفقًا لذلك:

 #apt install openjdk-8-jdk #apt install openjdk-8-jre #export JAVA_HOME “____JAVA” 

ثم يمكنك الذهاب مباشرة إلى تثبيت Tomcat.

الشيء الأساسي الذي يجب الانتباه إليه - منح حقوق المدير والمسؤول - بشكل افتراضي ، لا يمكنك إدارة التطبيقات عن بُعد ، وليس على الجهاز المحلي. خلاف ذلك ، كل شيء قياسي - تنزيل وتثبيت الحزمة وبدء الخدمة.

كتابة البرنامج


سيتألف البرنامج ، كما ذكر أعلاه ، من خادم وجزء من العميل. سننظر بإيجاز في جانب العميل ؛ فوظائف محرر الملف ووظائف التشفير لهما فائدة قصوى.

ومع ذلك ، أول الأشياء أولا.

لنبدأ مع جانب العميل.

كما هو مخطط له ، يجب أن يتيح الوصول إلى قائمة الملفات المخزنة على الخادم. نظرًا لأنه كان من المفترض أن يكون الحل رخيصًا ، فقد قمت بنقل قائمة الملفات في شكل نص لمربع نص غير نشط ، وأرفقت نموذجًا في الأسفل لتحديد اسم الملف المراد فتحه.

صورة
التين. 1 - واجهة تخزين الملفات

عند إدخال اسم ملف في سطر الإدخال ، يتم فتح الملف في نافذة أخرى - في المحرر. كود جافا للصفحة التي تسرد الملفات:

 File directory = new File(wayToDirs); String files = new String(); directory.mkdirs(); for (File i : directory.listFiles()) files+=i.getName()+"\n"; TextArea listOfFiles = new TextArea("files", Model.of("")); listOfFiles.setEnabled(false); listOfFiles.setDefaultModelObject(files); add(listOfFiles); 

HTML المطابق هو أكثر تافهة:

 <textarea wicket:id = "files" class="files" id = "files" /> <form wicket:id="selector" > <textarea wicket:id="name" class="input"/> <button wicket:id="opener" class="input" style="width: 10%"></button> </form> 

كما ذكرنا أعلاه ، فإن الصفحة التي بها المحرر والتشفير تمثل اهتمامًا مباشرًا. هناك ، يتم فتح الملف وتعديله وتشفيره وفك تشفيره وكذلك حفظه.

صورة
التين. 2 - واجهة المحرر

لنبدأ مع جانب الخادم - فمن الأسهل فهمه. من وجهة نظر الخادم ، يجب أن ينقر التطبيق على المفتاح لقبول النص من نافذة إدخال النص ، وقبول اسم الملف من السطر المقابل وحفظ المستند الناتج. في الواقع ، هذا ما يحدث في القائمة أدناه.

 TextField wayToSaveFile = new TextField("wayToSaveFile", Model.of("")); Button saveButton = new Button("save") { @Override public void onSubmit() { super.onSubmit(); File file = new File(DirectoryInterface.wayToDirs+"/" + wayToSaveFile.getInput()); try { FileWriter fw = new FileWriter(file); fw.write(textArea.getDefaultModelObject().toString()); fw.close(); } catch (Exception e) { System.out.println(e.getMessage()); debud.setDefaultModelObject(e.getMessage()); } } }; 
ولكن في وقت الحفظ ، الملف مشفر بالفعل. للقيام بذلك ، يتم تطبيق أزرار "تشفير" و "فك تشفير" في جزء العميل ، والتي تستخدم للتشفير وفك التشفير. يتم التشفير وفقًا لخوارزمية Vigenere ، وسأقول المزيد حول هذا الأمر بشكل منفصل ، ولكن يظهر في الوظائف.

وفقًا لذلك ، يبدو رمز العميل كما يلي:

 <script> function encryptFun(){ let outputString = ""; let inputString = document.getElementById("text").value; let password = document.getElementById("passwordTextField").value; for (let i = 0; i<inputString.toString().length-1; i++) outputString+=(String.fromCharCode((inputString.toString().charCodeAt(i)+256-password.toString().charCodeAt(i%password.toString().length))%256)); document.getElementById("text").value = outputString; return outputString; }; function decryptFun(){ let outputString = ""; let inputString = document.getElementById("text").value; let password = document.getElementById("passwordTextField").value; for (let i = 0; i<inputString.toString().length-1; i++) outputString+=(String.fromCharCode((inputString.toString().charCodeAt(i)+256+password.toString().charCodeAt(i%password.toString().length))%256)); document.getElementById("text").value = outputString; return outputString; }; </script> … <!—  - <input wicket:id="wayToSaveFile"class="input"> <button wicket:id = "save" class="input">Save</button> <input id = "passwordTextField" class="input"> <button id = "encrypt" onclick="encryptFun()" class="input"></button> <button id = "decrypt" onclick="decryptFun()" class="input"></button> 

وبالتالي ، بعد الضغط على زر التشفير ، يتم استبدال النص في حقل الإدخال بالنص الذي تم إرجاعه بواسطة وظيفة التشفير - والعكس بالعكس.

لا يحدد الإصدار الحالي من التطبيق تلقائيًا ما إذا كان النص مشفرًا ، لذا فإن أي نص غير متصل يعتبر مشفرًا.

خوارزمية التشفير


لقد اخترت خوارزمية تشفير Vigenere - وهي عبارة عن تباين في تشفير قيصر مع تغيير متغير حسب الكلمة الأساسية. شفرة مصدر الإدخال ومفتاح الطول التعسفي. ثم يتم إزاحة العضو i من النص المصدر برقم التسلسل في الأبجدية لرمز كلمة المرور j ، حيث j = i٪ (طول كلمة المرور). الخوارزمية ليست هي الأكثر مثالية أو مقاومة للتحليل ، ولكن مع طول كلمة مرور كافية فإنه يوفر بعض الموثوقية.

وفقًا لمواد من الكتابات حول تحليل الشفرات ، فإن تشفير Vigenere "يطمس" خصائص ترددات ظهور الحروف في النص ، ولكن تبقى بعض سمات ظهور الأحرف في النص. العيب الرئيسي لشفرات Vigenere هو أن مفتاحها يتكرر. لذلك ، يمكن بناء تحليل بسيط للشفرات على مرحلتين:

  1. البحث طول المفتاح. يمكنك تحليل توزيع الترددات في نص مشفر مع هلاك مختلف. أي ، خذ نصًا يشتمل على كل حرف ثانٍ من النص المشفر ، ثم كل ثالث ، وما إلى ذلك. حالما يختلف توزيع تردد الحروف اختلافًا كبيرًا عن الزي الموحد (على سبيل المثال ، عن طريق الانتروبيا) ، يمكننا التحدث عن طول المفتاح الموجود.
  2. تحليل الشفرات. وهناك مجموعة من الأصفار قيصر (حيث l هو طول المفتاح وجدت) ، والتي يتم تصدعها بشكل فردي بسهولة.

يمكن أن تساعد اختبارات Friedman و Kassiski في تحديد طول المفتاح.

مناقشة أكثر تفصيلا من اختراق فيزنر هو مرة أخرى خارج نطاق هذه المقالة.

النتائج


في إطار هذه المقالة ، تمت كتابة خوارزمية لكتابة تطبيق يوفر تخزينًا آمنًا ونقل الملفات النصية عبر الشبكة التي تتطلب الوصول المشترك.

بعض القرارات التي تم التعبير عنها أعلاه مثيرة للجدل أو ليست مثالية ، ولكن يشار إلى المنطق الأساسي والأشياء الأساسية.
github.com/Toxa-p07a1330/encriptedStorage

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


All Articles