最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)SSH模式加密

 更新時間:2016年01月07日 10:43:12   作者:沉默王二  
這篇文章主要介紹了Java實(shí)現(xiàn)SSH模式加密的相關(guān)資料,需要的朋友可以參考下

Java實(shí)現(xiàn)SSH模式加密的實(shí)現(xiàn)原理思路分享給大家。

一、SSH加密原理

SSH是先通過非對稱加密告訴服務(wù)端一個對稱加密口令,然后進(jìn)行驗(yàn)證用戶名和密碼的時候,使用雙方已經(jīng)知道的加密口令進(jìn)行加密和解密,見下圖:

解釋:SSH中為什么要使用非對稱加密,又使用對稱加密,到底有什么用處?到底安全不安全?既然后來又使用了對稱加密,開始的時候?yàn)槭裁催€要用非對稱加密?反過來,既然用非對稱加密,為什么又要使用對稱加密呢?

非對稱加密,是為了將客戶端產(chǎn)生的256位隨機(jī)的口令傳遞到服務(wù)端,那么在傳遞的過程中,使用公鑰進(jìn)行了加密,這樣,這個256位的加密口令就很難被網(wǎng)絡(luò)上進(jìn)行破解。
對稱加密,因?yàn)轭l繁的使用非對稱加密是非常浪費(fèi)性能的,那么SSH就是用了256位長度的口令作為接下來傳遞用戶名密碼時的加密口令,其破解的難度,想必大家都知道了,每一位上都有0-9種變化。
這樣安全嗎,我覺得還是很不錯的,具體使用起來也易于讓人理解。
二、我的SSH加密原理

①、使用場景

我所開發(fā)的項(xiàng)目是大宗期貨交易,主要服務(wù)于交易所,這也就產(chǎn)生一個需求就是,我們需要控制交易所使用我們軟件的周期。也就是說我們的項(xiàng)目留有一個后門,用來控制項(xiàng)目的周期,假如交易所使用軟件的周期到了,那么如果他不續(xù)費(fèi),而項(xiàng)目的代碼部署在人家的服務(wù)器上,此時我們就很難控制了,但是有了這個后門,到期后會自動停止軟件,這樣就不擔(dān)心交易所不給我們錢了。

②、使用方式

我們給交易的項(xiàng)目代碼中包含一個后門,該后門通過webservice client發(fā)送一個請求到web service。
web service接收到請求后,回給client需要的信息。
在以上這個過程當(dāng)中,就會產(chǎn)生一個SSH加密的請求方式,請?jiān)试S我用一個拙劣的圖表示一下。

三、我的SSH具體實(shí)現(xiàn)

既然要用到webservice,那么就需要建立web service服務(wù),還有web service client。關(guān)于這方面,我暫時不想說太多,方式有很多,我在這就不誤導(dǎo)大家了。我是通過eclipse搞定的,可參照webservice之間通信 。

接下來,我將介紹代碼,但是考慮到篇幅問題,一些不必要的代碼我就不貼出來了,關(guān)鍵在于講解清楚這個原理。

①、service

ExchangeService.java

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

  // 返回對象
  KeyResult keyResult = new KeyResult();

  try {
    // 先獲取公鑰
    if (resultType.equals(PUBLIC_KEY_RESULT_TYPE)) {

      Map<String, Object> keyMap = RSACoder.initKey();
      // 產(chǎn)生公鑰和私鑰
      privateKey = RSACoder.getPrivateKey(keyMap);

      keyResult.setKey(RSACoder.getPublicKey(keyMap));

      logger.info("公鑰字符串:" + keyResult.getKey());
      logger.info("私鑰字符串:" + privateKey);

    } else if (resultType.equals(ECHOSTR_RESULT_TYPE)) {

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

    } else {
      // 通過數(shù)據(jù)庫獲取交易所對應(yīng)的權(quán)限信息.
      // 先將請求轉(zhuǎn)換為byte數(shù)組,然后再進(jìn)行解密,最后轉(zhuǎn)換為字符串
      ExchangeInfo info = ExchangeInfo.dao.getInfoByName(new String(CryptUtil.decrypt(
          new BASE64Decoder().decodeBuffer(param), echoStr.getBytes())));

      String result = "";

      // 獲取系統(tǒng)啟用權(quán)限
      if (resultType.equals(PRIVILEGE_RESULT_TYPE)) {
        // 先判斷使用權(quán)限

        // 在判斷使用日期
        // 當(dāng)前登錄用登錄時獲取登錄的當(dāng)前日期和開始日期進(jìn)行比較,然后計算還可以使用的日期
        long time = (new Date().getTime() / 1000) - string2DateInt(openday);
        // 換算成天數(shù)
        int day = (int) (time / (60 * 60 * 24));
        // 還可以使用的天數(shù)
        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;
}

再贅述一下:

第一個判斷語句中的內(nèi)容就是生成公鑰和私鑰,并且返回公鑰。
第二個判斷語句中的內(nèi)容就是保存client發(fā)送的隨機(jī)字符串,這一步非常關(guān)鍵,隨機(jī)字符串首先通過公鑰進(jìn)行了加密,這大大加強(qiáng)了加密的深度。
第三個判斷語句中的內(nèi)容就是將client的權(quán)限通過隨機(jī)字符串進(jìn)行加密。
②、client

ExchangeUtil.java

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

  while (true) {
    try {
      // webservice調(diào)用類
      ExchangeServiceProxy proxy = new ExchangeServiceProxy();
      BASE64Encoder encoder = new BASE64Encoder();

      // step1.獲取service產(chǎn)生的公鑰
      KeyResult keyResult = JsonUtil.byteToObject(proxy.request(null, PUBLIC_KEY_RESULT_TYPE),
          KeyResult.class);

      // step2.產(chǎn)生隨機(jī)字符串,發(fā)送到webserivce
      String echoStr = StrUtil.getEchoStrByLength(10);
      byte[] echoByteParam = RSACoder.encryptByPublicKey(echoStr.getBytes(), keyResult.getKey());
      proxy.request(encoder.encode(echoByteParam), ECHOSTR_RESULT_TYPE);

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

      // step4.通過口令解密服務(wù)端返回消息
      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;
}

稍作解釋:

通過循環(huán)主要為了防止網(wǎng)絡(luò)斷開時服務(wù)不停的發(fā)送請求,最多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兩種加密就夠我們使用了!
至于其他的輔助類我就不多介紹了,網(wǎng)上有很多資源,希望大家可以結(jié)合學(xué)習(xí)。

相關(guān)文章

  • IDEA Maven 配置備忘筆記

    IDEA Maven 配置備忘筆記

    這篇文章主要介紹了IDEA Maven 配置備忘筆記,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • java 將byte中的有效長度轉(zhuǎn)換為String的實(shí)例代碼

    java 將byte中的有效長度轉(zhuǎn)換為String的實(shí)例代碼

    下面小編就為大家?guī)硪黄猨ava 將byte中的有效長度轉(zhuǎn)換為String的實(shí)例代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • java 淺析代碼塊的由來及用法

    java 淺析代碼塊的由來及用法

    所謂代碼塊是指用"{}"括起來的一段代碼,根據(jù)其位置和聲明的不同,可以分為普通代碼塊、構(gòu)造塊、靜態(tài)塊、和同步代碼塊。如果在代碼塊前加上 synchronized關(guān)鍵字,則此代碼塊就成為同步代碼塊
    2021-10-10
  • Servlet+MyBatis項(xiàng)目轉(zhuǎn)Spring Cloud微服務(wù),多數(shù)據(jù)源配置修改建議

    Servlet+MyBatis項(xiàng)目轉(zhuǎn)Spring Cloud微服務(wù),多數(shù)據(jù)源配置修改建議

    今天小編就為大家分享一篇關(guān)于Servlet+MyBatis項(xiàng)目轉(zhuǎn)Spring Cloud微服務(wù),多數(shù)據(jù)源配置修改建議,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • 啟用springboot security后登錄web頁面需要用戶名和密碼的解決方法

    啟用springboot security后登錄web頁面需要用戶名和密碼的解決方法

    這篇文章主要介紹了啟用springboot security后登錄web頁面需要用戶名和密碼的解決方法,也就是使用默認(rèn)用戶和密碼登錄的操作方法,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • 教你創(chuàng)建springcloud微服務(wù)的基礎(chǔ)子服務(wù)的超詳細(xì)過程

    教你創(chuàng)建springcloud微服務(wù)的基礎(chǔ)子服務(wù)的超詳細(xì)過程

    這篇文章主要介紹了創(chuàng)建springcloud微服務(wù)的基礎(chǔ)子服務(wù),主要是創(chuàng)建兩個springboot服務(wù),在教程中增加springcloud相關(guān)組件,本文分步驟給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • 詳解ArrayBlockQueue源碼解析

    詳解ArrayBlockQueue源碼解析

    這篇文章主要介紹了ArrayBlockQueue源碼解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java數(shù)組的運(yùn)用詳解

    Java數(shù)組的運(yùn)用詳解

    這篇文章主要給大家介紹了關(guān)于Java中數(shù)組的定義和使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • Java深入分析了解平衡二叉樹

    Java深入分析了解平衡二叉樹

    平衡二叉樹又被稱為AVL樹(有別于AVL算法),且具有以下性質(zhì):它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,并且左右兩個子樹都是一棵平衡二叉樹。本文將詳解介紹一下平衡二叉樹的原理與實(shí)現(xiàn),需要的可以參考一下
    2022-06-06
  • java中HashMap.values()轉(zhuǎn)為ArrayList()問題

    java中HashMap.values()轉(zhuǎn)為ArrayList()問題

    這篇文章主要介紹了java中HashMap.values()轉(zhuǎn)為ArrayList()問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評論

兴业县| 白朗县| 中江县| 乐都县| 青川县| 凌云县| 广水市| 石首市| 荆州市| 湘阴县| 福安市| 汤原县| 河北区| 临泽县| 辉县市| 高淳县| 叶城县| 邵阳市| 安仁县| 乡宁县| 子长县| 周口市| 文水县| 安顺市| 嘉善县| 剑河县| 甘南县| 武宣县| 灵丘县| 武城县| 龙山县| 清徐县| 延津县| 伊宁市| 榆树市| 得荣县| 兴隆县| 南岸区| 万全县| 铅山县| 潼南县|