Принципы реализации и идеи реализации Java -реализации SSH -режима обмениваются с вами.
1. Принцип шифрования SSH
SSH сначала сообщает серверу асимметричный пароль шифрования через асимметричное шифрование, а затем использует пароль шифрования, который обе стороны уже знают для шифрования и дешифрования, см. Рисунок ниже:
Объяснение: Зачем нам использовать асимметричное шифрование и симметричное шифрование в SSH? Что это за использование? Это безопасно или нет? Затем мы использовали симметричное шифрование, почему мы использовали асимметричное шифрование в начале? С другой стороны, поскольку используется асимметричное шифрование, почему симметричное шифрование должно использоваться?
Асимметричное шифрование состоит в том, чтобы передать 256-битный случайный пароль, сгенерированный клиентом на сервер. Затем, в процессе доставки, открытый ключ используется для шифрования, так что этот 256-битный зашифрованный пароль трудно взломать в сети.
Симметричное шифрование, поскольку частое использование асимметричного шифрования является пустой тратой производительности, SSH использует 256-битный пароль в качестве зашифрованного пароля при прохождении имени пользователя и пароля. Я полагаю, что все знают о сложности растрескивания, и в каждом бите есть 0-9 изменений.
Это безопасно? Я думаю, что это все еще очень хорошо, и это легко понять при использовании.
2. мой принцип шифрования моего SSH
①, сценарии использования
Проект, который я разработал, представляет собой объемную торговлю фьючерсами, которая в основном обслуживает обмены, что создает спрос, который нам необходимо для управления циклом обменов с помощью нашего программного обеспечения. Другими словами, в нашем проекте есть задний ход для контроля цикла проекта. Если Exchange использует программный цикл, если он не обновляется, а код проекта развернут на чужом сервере, нам будет трудно контролировать его. Тем не менее, с этим Backdoor, программное обеспечение будет автоматически остановлено после истечения срока его действия, поэтому мы не беспокоимся о том, что обмен не даст нам деньги.
② Метод использования
Код проекта, который мы предоставляем транзакции, содержит бэкдор, который отправляет запрос в веб -службу через клиента Webservice.
После получения запроса веб -служба возвращает информацию, необходимую клиенту.
В приведенном выше процессе будет создан метод запроса шифрования SSH. Пожалуйста, позвольте мне использовать неуклюжую фигуру, чтобы представить ее.
3. моя реализация SSH
Поскольку вы хотите использовать Webservice, вам необходимо создать услугу веб -службы и клиента веб -службы. Я не хочу слишком много говорить об этом, есть много способов, поэтому я не буду вводить здесь все в заблуждение здесь. Я сделал это через Eclipse, и я могу ссылаться на связь между веб -сервисами.
Затем я представлю код, но, учитывая проблему длины, я не буду публиковать некоторые ненужные коды. Ключ должен четко объяснить этот принцип.
①, обслуживание
Exchangeservice.java
public byte [] request (string param, string resusttype) {logger.info ("Параметр запроса:" + param); // вернуть объект Keyresult keyresult = new Keyresult (); try {// Получите открытый ключ первым if (recoudtype.equals (public_key_result_type)) {map <string, object> keymap = rsacoder.initkey (); // генерировать государственные и частные ключи privatekey = rsacoder.getPrivateKey (KeyMap); keyresult.setkey (rsacoder.getpublickey (keymap)); logger.info ("Строка открытого ключа:" + keyresult.getKey ()); logger.info ("строка личного ключа:" + privateKey); } else if (resultType.equals (echoStr_Result_type)) {// Установить информацию о пароле байта клиента [] parambyte = new base64decoder (). decodebuffer (param); echoStr = new String (rsacoder.decryptbyprivatekey (parambyte, privatekey)); } else {// Получить информацию о разрешении, соответствующую обмену через базу данных. // Сначала конвертировать запрос в байтовый массив, затем расшифровывать его и, наконец, преобразовать его в строковую exchangeinfo info = ExchangeInfo.dao.getInfobyname (new String (cryptutil.decrypt (new Base64decoder (). Decodebuffer (param), echoStr.getBytes ()));); String result = ""; // Получите разрешения на включение системы, если (ResultType.equals (priviege_result_type)) {// сначала судить разрешения на использование // При оценке даты использования // текущего входа в систему для получения текущей даты и даты начала входа для сравнения, а затем вычислять даты, которые все еще могут быть использованы давно = (новая дата (). // конвертируется в дни int day = (int) (время / (60 * 60 * 24)); // количество дней, которые все еще можно использовать, если (ussAyse - day> 0) {// Вы можете использовать result = "1"; } else {// Вы не можете использовать result = "0"; }} keyresult.setResult (cryptutil.encrypt (result.getbytes (), echostr.getbytes ())); } return jsonutil.objecttobyte (keyresult); } catch (Exception e) {logger.error ("ошибка веб -сервиса !!!); logger.error (e.getMessage (), e); } return null;}Позвольте мне уточнить это:
Контент в заявлении первого суждения заключается в создании государственных и частных ключей и возвращении открытого ключа.
Контент во втором утверждении состоит в том, чтобы сохранить случайную строку, отправленную клиентом. Этот шаг очень критичен. Случайная строка сначала шифруется с открытым ключом, который значительно увеличивает глубину шифрования.
Контент в третьем судебном утверждении состоит в том, чтобы зашифровать разрешения клиента по случайной строке.
②, клиент
ExchangeUtil.java
Public Static Boolean CanrunFerexChange (String Restultype) {int i = 1; логический результат = false; while (true) {try {// webservice cllass class crackserviceproxy proxy = new FixganserviceProxy (); Base64encoder encoder = new Base64encoder (); // Шаг 1. Получите открытый ключ, сгенерированный сервисом Keyresult Keyresult = jsonutil.bytetoobject (proxy.request (null, public_key_result_type), keyresult.class); // step2. Сгенерировать случайную строку и отправить ее в WebsErivce String echoStr = strutil.getechoStrbylength (10); byte [] echobyteparam = rsacoder.encryptbypublickey (echostr.getbytes (), keyresult.getkey ()); proxy.request (encoder.encode (echobyteparam), echostr_result_type); // шаг3. Зашифруйте информацию о запросе клиента и отправьте ее в Webservice // Сначала зашифровать в виде массива байтов, а затем преобразовать ее в струнный байт [] results = proxy.request (encoder.encode (cryptutil.encrypt (constants.client_type.getbytes (), echostr.getbytes ())), reflurepe); keyresult = jsonutil.bytetoobject (результаты, keyresult.class); // шаг 4. Вернуть сообщение через пароль Decryption Server respons = new String (cryptutil.decrypt (keyresult.getResult (), echoStr.getBytes ())); if (response.equals ("1")) {result = true; } перерыв; } catch (Exception e) {logger.debug ("th" + i + "Time Загрузка веб -сервиса не удалась"); i ++; logger.error (e.getMessage (), e); if (i> = 10) {break; }}} return result;}Краткое объяснение:
Цикл предназначен в основном для предотвращения постоянной отправки запросов, когда сеть отключена, и до 10 раз достаточно.
Есть четыре основных шага, и то, что я хочу объяснить в комментариях, в порядке.
③ Общее шифрование и дешифрование общественных классов
Cryptutil.java
пакет com.honzh.socket.util; import javax.crypto.cipher; import javax.crypto.secretkey; import javax.crypto.secretkeyfactory; import javax.crypto.spec.deskeyspec; import javax.crypto.spec.ivparameterspec; Encrypt * @description: incrypt * @param data * @param key * @return * @throws exception */ public static byte [] encrypt (byte [] data, byte [] key), бросает исключение {key = get8 (key); Шифр Cipher = cipher.getInstance ("des/cbc/pkcs5padding"); Deskeyspec deskeyspec = new deskeyspec (key); SecretKey keyFactory = secretKeyFactory.getInstance ("des"); SecretKey SecretKey = keyFactory.GenerateCret (deskeySpec); Ivparameterspec iv = new ivparameterspec (key); cipher.init (cipher.encrypt_mode, secretkey, iv); return cipher.dofinal (data); } / ** * @title: Decrypt * @description: Decrypt * @param data * @param key * @return * @throws exception * / public static byte [] decrypt (byte [] data, byte [] key) throws exection {key = get8 (key); Шифр Cipher = cipher.getInstance ("des/cbc/pkcs5padding"); Deskeyspec deskeyspec = new deskeyspec (key); SecretKeyFactory KeyFactory = secretKeyFactory.getInstance ("des"); SecretKey SecretKey = keyFactory.GenerateCret (deskeySpec); Ivparameterspec iv = new ivparameterspec (key); cipher.init (cipher.decrypt_mode, secretkey, iv); return cipher.dofinal (data); } частный статический байт [] get8 (byte [] key) {byte [] key1 = new Byte [8]; for (int i = 0; i <8; i ++) {key1 [i] = key [i]; } return key1; } public Static String toHexString (byte [] data) {String s = ""; for (int i = 0; i <data.length; i ++) {s+= integer.tohexstring (data [i] & 0xff)+"-"; } return s; }} Вообще говоря, шифрование SHA и MD5 достаточно для нас, чтобы использовать!
Что касается других вспомогательных категорий, я не буду их много. В Интернете много ресурсов, и я надеюсь, что каждый может учиться в комбинации.