Java实现SSH模式加密_java 如何实现调用数据接口认证采用ssh协议加密加密认证。(1)

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

        // 先将请求转换为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;

}


再赘述一下:


1. 第一个判断语句中的内容就是生成公钥和私钥,并且返回公钥。
2. 第二个判断语句中的内容就是保存client发送的随机字符串,这一步非常关键,随机字符串首先通过公钥进行了加密,这大大加强了加密的深度。
3. 第三个判断语句中的内容就是将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;

}


稍作解释:


1. 通过循环主要为了防止网络断开时服务不停的发送请求,最多10次就够了。
2. 主要有四步操作,注释中我想解释的还可以。


##### ③、共享加密解密公共类


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

}




![img](https://img-blog.csdnimg.cn/img_convert/692fc8f89a38e17f367240b8d9ce19a5.png)
![img](https://img-blog.csdnimg.cn/img_convert/694ffc0fe02a36342fb281b5b347b58b.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值