程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java完成SSH形式加密

Java完成SSH形式加密

編輯:關於JAVA

Java完成SSH形式加密。本站提示廣大學習愛好者:(Java完成SSH形式加密)文章只能為提供參考,不一定能成為您想要的結果。以下是Java完成SSH形式加密正文


Java完成SSH形式加密的完成道理思緒分享給年夜家。

1、SSH加密道理

SSH是先經由過程非對稱加告密訴辦事端一個對稱加密口令,然落後行驗證用戶名和暗碼的時刻,應用兩邊曾經曉得的加密口令停止加密息爭密,見下圖:

說明:SSH中為何要應用非對稱加密,又應用對稱加密,究竟有甚麼用途?究竟平安不平安?既然後來又應用了對稱加密,開端的時刻為何還要用非對稱加密?反過去,既然用非對稱加密,為何又要應用對稱加密呢?

非對稱加密,是為了將客戶端發生的256位隨機的口令傳遞到辦事端,那末在傳遞的進程中,應用公鑰停止了加密,如許,這個256位的加密口令就很難被收集長進行破解。
對稱加密,由於頻仍的應用非對稱加密長短常糟蹋機能的,那末SSH就是用了256位長度的口令作為接上去傳遞用戶名暗碼時的加密口令,其破解的難度,想必年夜家都曉得了,每位上都有0-9種變更。
如許平安嗎,我認為照樣很不錯的,詳細應用起來也易於讓人懂得。
2、我的SSH加密道理

①、應用場景

我所開辟的項目是年夜宗期貨生意業務,重要辦事於生意業務所,這也就發生一個需求就是,我們須要掌握生意業務所應用我們軟件的周期。也就是說我們的項目留有一個後門,用來掌握項目標周期,假設生意業務所應用軟件的周期到了,那末假如他不續費,而項目標代碼安排在人家的辦事器上,此時我們就很難掌握了,然則有了這個後門,到期後會主動停滯軟件,如許就不擔憂生意業務所不給我們錢了。

②、應用方法

我們給生意業務的項目代碼中包括一個後門,該後門經由過程webservice client發送一個要求到web service。
web service吸收到要求後,回給client須要的信息。
在以上這個進程傍邊,就會發生一個SSH加密的要求方法,請許可我用一個低劣的圖表現一下。

3、我的SSH詳細完成

既然要用到webservice,那末就須要樹立web service辦事,還有web service client。關於這方面,我臨時不想說太多,方法有許多,我在這就不誤導年夜家了。我是經由過程eclipse弄定的,可參照webservice之間通訊 。

接上去,我將引見代碼,然則斟酌到篇幅成績,一些不用要的代碼我就不貼出來了,症結在於講授清晰這個道理。

①、service

ExchangeService.java

public byte[] request(String param, String resultType) {
  logger.info("要求參數:" + param);

  // 前往對象
  KeyResult keyResult = new KeyResult();

  try {
    // 先獲得公鑰
    if (resultType.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)) {

      // 設置客戶真個口令信息
      byte[] paramByte = new BASE64Decoder().decodeBuffer(param);
      echoStr = new String(RSACoder.decryptByPrivateKey(paramByte, privateKey));

    } else {
      // 經由過程數據庫獲得生意業務所對應的權限信息.
      // 先將要求轉換為byte數組,然後再停止解密,最初轉換為字符串
      ExchangeInfo info = ExchangeInfo.dao.getInfoByName(new String(CryptUtil.decrypt(
          new BASE64Decoder().decodeBuffer(param), echoStr.getBytes())));

      String result = "";

      // 獲得體系啟用權限
      if (resultType.equals(PRIVILEGE_RESULT_TYPE)) {
        // 先斷定應用權限

        // 在斷定應用日期
        // 以後登錄用登錄時獲得登錄確當前日期和開端日期停止比擬,然後盤算還可使用的日期
        long time = (new Date().getTime() / 1000) - string2DateInt(openday);
        // 換算成天數
        int day = (int) (time / (60 * 60 * 24));
        // 還可使用的天數
        if (usedays - day > 0) {
          // 可使用
          result = "1";
        } else {
          // 沒法應用
          result = "0";
        }

      }

      keyResult.setResult(CryptUtil.encrypt(result.getBytes(), echoStr.getBytes()));
    }

    return JsonUtil.objectToByte(keyResult);
  } catch (Exception e) {
    logger.error("webservice失足了!!!!");
    logger.error(e.getMessage(), e);
  }

  return null;
}

再贅述一下:

第一個斷定語句中的內容就是生成公鑰和私鑰,而且前往公鑰。
第二個斷定語句中的內容就是保留client發送的隨機字符串,這一步異常症結,隨機字符串起首經由過程公鑰停止了加密,這年夜年夜增強了加密的深度。
第三個斷定語句中的內容就是將client的權限經由過程隨機字符串停止加密。
②、client

ExchangeUtil.java

public static boolean canRunForExchange(String resultType) {
  int i = 1;
  boolean result = false;

  while (true) {
    try {
      // webservice挪用類
      ExchangeServiceProxy proxy = new ExchangeServiceProxy();
      BASE64Encoder encoder = new BASE64Encoder();

      // step1.獲得service發生的公鑰
      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);

      // step3.加密客戶端要求信息,然後發送到webservice
      // 先加密為byte數組,然後轉換成字符串
      byte[] results = proxy.request(
          encoder.encode(CryptUtil.encrypt(Constants.client_type.getBytes(), echoStr.getBytes())),
          resultType);
      keyResult = JsonUtil.byteToObject(results, KeyResult.class);

      // step4.經由過程口令解密辦事端前往新聞
      String response = new String(CryptUtil.decrypt(keyResult.getResult(), echoStr.getBytes()));
      if (response.equals("1")) {
        result = true;
      }
      break;
    } catch (Exception e) {
      logger.debug("第" + i + "次加載webservice掉敗");
      i++;
      logger.error(e.getMessage(), e);

      if (i >= 10) {
        break;
      }
    }
  }

  return result;
}

稍作說明:

經由過程輪回重要為了避免收集斷開時辦事一直的發送要求,最多10次就夠了。
重要有四步操作,正文中我想說明的還可以。
③、同享加密解密公共類

CryptUtil.java

package 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;

public class CryptUtil {
  /** 
  * @Title: encrypt 
  * @Description: 加密
  * @param data
  * @param key
  * @return
  * @throws Exception
  */
  public static byte[] encrypt(byte[] data, byte[] key) throws Exception {
    key = get8(key);
    Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
    DESKeySpec desKeySpec = new DESKeySpec(key);
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
    SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
    IvParameterSpec iv = new IvParameterSpec(key);
    cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
    return cipher.doFinal(data);
  }

  /** 
  * @Title: decrypt 
  * @Description: 解密
  * @param data
  * @param key
  * @return
  * @throws Exception
  */
  public static byte[] decrypt(byte[] data, byte[] key) throws Exception {
    key = get8(key);
    Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
    DESKeySpec desKeySpec = new DESKeySpec(key);
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
    SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
    IvParameterSpec iv = new IvParameterSpec(key);
    cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
    return cipher.doFinal(data);
  }

  private static byte[] 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兩種加密就夠我們應用了!
至於其他的幫助類我就不多引見了,網上有許多資本,願望年夜家可以聯合進修。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved