تتم مشاركة مبادئ التنفيذ وأفكار تشفير وضع SSH Java.
1. مبدأ تشفير SSH
يخبر SSH أولاً كلمة مرور التشفير غير المتماثل من خلال التشفير غير المتماثل ، ثم يستخدم كلمة مرور التشفير التي يعرفها الطرفين بالفعل للتشفير وفك التشفير ، راجع الشكل أدناه:
Explanation: لماذا نحتاج إلى استخدام التشفير غير المتماثل والتشفير المتماثل في SSH؟ ما هو استخدامه؟ هل هي آمنة أم لا؟ ثم استخدمنا التشفير المتماثل ، لماذا استخدمنا التشفير غير المتماثل في البداية؟ من ناحية أخرى ، نظرًا لاستخدام التشفير غير المتماثل ، فلماذا يجب استخدام التشفير المتماثل؟
يتمثل التشفير غير المتماثل في تمرير كلمة المرور العشوائية 256 بت التي تم إنشاؤها بواسطة العميل إلى الخادم. بعد ذلك ، أثناء عملية التسليم ، يتم استخدام المفتاح العام للتشفير ، بحيث يصعب تصدع كلمة المرور المشفرة بسعة 256 بت على الشبكة.
التشفير المتماثل ، لأن الاستخدام المتكرر للتشفير غير المتماثل هو مضيعة للأداء ، يستخدم SSH كلمة مرور طولها 256 بت ككلمة مرور مشفرة عند تمرير اسم المستخدم وكلمة المرور التالية. أعتقد أن الجميع يعرفون صعوبة التكسير ، وهناك تغييرات 0-9 في كل بت.
هل هذا آمن؟ أعتقد أنه لا يزال جيدًا جدًا ، ومن السهل فهمه عند استخدامه.
2. مبدأ تشفير SSH الخاص بي
① ، سيناريوهات الاستخدام
المشروع الذي طورته هو تداول العقود المستقبلية بالجملة ، والذي يخدم بشكل أساسي التبادلات ، مما يخلق طلبًا نحتاجه للتحكم في دورة البورصات باستخدام برنامجنا. وبعبارة أخرى ، فإن مشروعنا لديه الباب الخلفي للتحكم في دورة المشروع. إذا كانت البورصة تستخدم دورة البرنامج ، إذا لم يتم تجديدها ونشر رمز المشروع على خادم شخص آخر ، فسيكون من الصعب علينا التحكم فيه. ومع ذلك ، مع هذا الباب الخلفي ، سيتم إيقاف البرنامج تلقائيًا بعد انتهاء صلاحيته ، لذلك لا يقلقنا من أن البورصة لن يمنحنا المال.
② ، طريقة الاستخدام
يحتوي رمز المشروع الذي نقدمه للمعاملة على الباب الخلفي ، والذي يرسل طلبًا إلى خدمة الويب من خلال عميل WebService.
بعد تلقي الطلب ، تقوم خدمة الويب بإرجاع المعلومات التي يحتاجها العميل.
في العملية أعلاه ، سيتم إنشاء طريقة طلب تشفير SSH. واسمحوا لي أن أستخدم شخصية خرقاء لتمثيلها.
3. تنفيذ SSH الخاص بي
نظرًا لأنك ترغب في استخدام WebService ، فأنت بحاجة إلى إنشاء خدمة خدمة ويب وعميل خدمة ويب. لا أريد أن أقول الكثير عن هذا الوقت في الوقت الحالي ، فهناك العديد من الطرق ، لذلك لن أضلل الجميع هنا. لقد فعلت ذلك من خلال Eclipse ، ويمكنني الرجوع إلى التواصل بين خدمات الويب.
بعد ذلك ، سأقدم الرمز ، لكن بالنظر إلى قضية الطول ، لن نشر بعض الرموز غير الضرورية. المفتاح هو شرح هذا المبدأ بوضوح.
① ، الخدمة
Exchangeservice.java
طلب البايت العام [] (سلسلة param ، string resulttype) {logger.info ("المعلمة طلب:" + param) ؛ // إرجاع كائن keyResult keyResult = new KeyResult () ؛ حاول {// الحصول على المفتاح العام أولاً إذا (resultType.equals (public_key_result_type)) {map <string ، object> keymap = rsacoder.initkey () ؛ // إنشاء المفاتيح العامة والخاصة الخاصة = rsacoder.getPrivinKey (keymap) ؛ keyresult.setkey (rsacoder.getPublicKey (keymap)) ؛ logger.info ("سلسلة المفاتيح العامة:" + keyresult.getKey ()) ؛ logger.info ("سلسلة المفاتيح الخاصة:" + privatekey) ؛ } آخر إذا (resultType.equals (echoStr_result_type)) {// قم بتعيين معلومات كلمة المرور الخاصة ببايت العميل [] parambyte = new Base64Decoder (). decodeBuffer (param) ؛ echoStr = سلسلة جديدة (rsacoder.decryptbyprivatekey (parambyte ، privatekey)) ؛ } آخر {// احصل على معلومات الإذن المقابلة للتبادل من خلال قاعدة البيانات. // أولاً ، قم بتحويل الطلب إلى صفيف بايت ، ثم فك تشفيره ، وأخيراً تحويله إلى exchangeinfo info = ExchangeInfo.dao.getInfoByname (سلسلة جديدة (cryptutil.decrypt (base64decoder (). نتيجة السلسلة = "" ؛ // احصل على أذونات تمكين النظام إذا كان (resultType.equals (امتياز _result_type)) {// أولاً يحكم على أذونات الاستخدام // عند الحكم على تاريخ الاستخدام // استخدام تسجيل الدخول الحالي للحصول على التاريخ الحالي وتاريخ بدء تسجيل الدخول للمقارنة ، ثم حساب المواعدة التي لا يزال من الممكن استخدامها = (تاريخ جديد.). // convert to days int day = (int) (time / (60 * 60 * 24)) ؛ // عدد الأيام التي لا يزال من الممكن استخدامها إذا (useays - day> 0) {// يمكنك استخدام result = "1" ؛ } آخر {// لا يمكنك استخدام result = "0" ؛ }} keyresult.setResult (cryptutil.encrypt (result.getBytes () ، echoStr.getBytes ())) ؛ } return jsonutil.objecttobyte (keyResult) ؛ } catch (استثناء e) {logger.error ("خطأ WebService !!!") ؛ logger.error (e.getMessage () ، e) ؛ } إرجاع فارغ ؛}اسمحوا لي أن أوضح ذلك:
المحتوى في بيان الحكم الأول هو إنشاء المفاتيح العامة والخاصة وإعادة المفتاح العام.
المحتوى في بيان الحكم الثاني هو حفظ السلسلة العشوائية التي أرسلها العميل. هذه الخطوة أمر بالغ الأهمية. يتم تشفير السلسلة العشوائية لأول مرة مع المفتاح العام ، مما يعزز بشكل كبير عمق التشفير.
المحتوى في بيان الحكم الثالث هو تشفير أذونات العميل من خلال سلسلة عشوائية.
② ، العميل
Exchangeutil.java
public static boolean canrunforexchange (String resultType) {int i = 1 ؛ نتيجة منطقية = خطأ ؛ بينما (صواب) {try {// webservice calls class parcyproxy proxy = new ExchangeServiceProxy () ؛ BASE64ENCODER ENCODER = جديد BASE64ENCODER () ؛ // Step1. احصل على المفتاح العام الذي تم إنشاؤه بواسطة keyresult keyresult service = jsonutil.bytetoObject (proxy.request (null ، public_key_result_type) ، keyresult.class) ؛ // Step2. قم بإنشاء سلسلة عشوائية وأرسلها إلى WebSerivce String echoStr = strutil.getechoStrbyLength (10) ؛ byte [] echobyteparam = rsacoder.encryptbybublickey (echosttr.getbytes () ، keyresult.getkey ()) ؛ proxy.request (Encoder.encode (echobyteparam) ، echoStr_result_type) ؛ // Step3. قم بتشفير معلومات طلب العميل وأرسلها إلى WebService // أولاً تشفير صفيف بايت ، ثم تحويلها إلى BYTE BYTE [] keyResult = jsonutil.bytetoObject (النتائج ، keyresult.class) ؛ // Step4. إرجاع رسالة من خلال استجابة سلسلة خادم Decryption Server = سلسلة جديدة (cryptutil.decrypt (keyResult.getResult () ، echostbytes ())) ؛ if (response.equals ("1")) {result = true ؛ } استراحة؛ } catch (استثناء e) {logger.debug ("th" + i + "فشل تحميل webservice") ؛ i ++ ؛ logger.error (e.getMessage () ، e) ؛ if (i> = 10) {break ؛ }}} نتيجة الإرجاع ؛}شرح موجز:
تتمثل الحلقة بشكل أساسي في منع الخدمة من إرسال الطلبات بشكل مستمر عند فصل الشبكة ، ويصل إلى 10 مرات.
هناك أربع خطوات رئيسية ، وما أريد أن أشرحه في التعليقات على ما يرام.
③ ، التشفير المشترك وفك تشفير الطبقات العامة
cryptutil.java
package com.honzh.socket.util ؛ استيراد javax.crypto.cipher ؛ استيراد javax.crypto.secretkey ؛ استيراد javax.crypto.secretkefactory ؛ استيراد javax.crypto.spec.deskeyspec ؛ استيراد javax.crypto.spec.ivparameterspeceterspeceterspecepecepecepecepecepecepecepecepecepecepecepeCpeC. title: encrypt * description: encrypt * param data * param key * regurn * @throws استثناء */ بايت ثابت عام [] incrypt (byte [] data ، byte [] key) يلقي الاستثناء {key = get8 (مفتاح) ؛ cipher cipher = cipher.getInstance ("des/cbc/pkcs5padding") ؛ deskeyspec deskeyspec = جديد deskeyspec (مفتاح) ؛ SecretKey keyfactory = secretKeyFactory.getInstance ("des") ؛ SecretKey SecretKey = keyfactory.generateSecret (deskeyspec) ؛ Ivparameterspec IV = New Ivparameterspec (مفتاح) ؛ cipher.init (cipher.encrypt_mode ، secretkey ، IV) ؛ إرجاع cipher.dofinal (البيانات) ؛ } / ** * title: decrypt * description: decrypt * param data * @param key * regurn * @throws استثناء * / البايت الثابت العام [] decrypt (byte [] data ، byte [] مفتاح) refressed {key = get8 (مفتاح) ؛ cipher cipher = cipher.getInstance ("des/cbc/pkcs5padding") ؛ deskeyspec deskeyspec = جديد deskeyspec (مفتاح) ؛ secretKeyFactory keyfactory = secretKeyFactory.getInstance ("des") ؛ SecretKey SecretKey = keyfactory.generateSecret (deskeyspec) ؛ Ivparameterspec IV = New Ivparameterspec (مفتاح) ؛ cipher.init (cipher.decrypt_mode ، secretkey ، IV) ؛ إرجاع cipher.dofinal (البيانات) ؛ } private static byte [] get8 (byte [] key) {byte [] key1 = new byte [8] ؛ لـ (int i = 0 ؛ i <8 ؛ i ++) {key1 [i] = key [i] ؛ } return key1 ؛ } السلسلة الثابتة العامة tohexstring (byte [] data) {string s = "" ؛ لـ (int i = 0 ؛ i <data.length ؛ i ++) {s+= integer.toHexString (data [i] & 0xff)+"-" ؛ } العودة s ؛ }} بشكل عام ، تشفير SHA و MD5 يكفي بالنسبة لنا لاستخدامه!
أما بالنسبة للفئات المساعدة الأخرى ، فلن أقدمها كثيرًا. هناك العديد من الموارد على الإنترنت ، وآمل أن يتعلم الجميع مجتمعة.