版权声明:欢迎转载,请注明沉默王二原创。 https://blog.csdn.net/qing_gee/article/details/44409735

Java实现SSH模式加密

一、SSH加密原理

SSH是先通过非对称加密告诉服务端一个对称加密口令,然后进行验证用户名和密码的时候,使用双方已经知道的加密口令进行加密和解密,见下图:

解释:SSH中为什么要使用非对称加密,又使用对称加密,到底有什么用处?到底安全不安全?既然后来又使用了对称加密,开始的时候为什么还要用非对称加密?反过来,既然用非对称加密,为什么又要使用对称加密呢?

  1. 非对称加密,是为了将客户端产生的256位随机的口令传递到服务端,那么在传递的过程中,使用公钥进行了加密,这样,这个256位的加密口令就很难被网络上进行破解。
  2. 对称加密,因为频繁的使用非对称加密是非常浪费性能的,那么SSH就是用了256位长度的口令作为接下来传递用户名密码时的加密口令,其破解的难度,想必大家都知道了,每一位上都有0-9种变化。
  3. 这样安全吗,我觉得还是很不错的,具体使用起来也易于让人理解。

二、我的SSH加密原理

①、使用场景

我所开发的项目是大宗期货交易,主要服务于交易所,这也就产生一个需求就是,我们需要控制交易所使用我们软件的周期。也就是说我们的项目留有一个后门,用来控制项目的周期,假如交易所使用软件的周期到了,那么如果他不续费,而项目的代码部署在人家的服务器上,此时我们就很难控制了,但是有了这个后门,到期后会自动停止软件,这样就不担心交易所不给我们钱了。

②、使用方式

  1. 我们给交易的项目代码中包含一个后门,该后门通过webservice client发送一个请求到web service。
  2. web service接收到请求后,回给client需要的信息。

在以上这个过程当中,就会产生一个SSH加密的请求方式,请允许我用一个拙劣的图表示一下。

三、我的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;
}

再赘述一下:

  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.产生随机字符串,发送到webserivceString 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;}}

一般情况下,SHA和MD5两种加密就够我们使用了!
至于其他的辅助类我就不多介绍了,网上有很多资源,也许你的项目也有类似的实现方式。


相关文章

  • webservice之间通信

感谢您阅读【沉默王二的博客】,如果王二的博客给您带来一丝帮助或感动,我(也就是王二)将不甚荣幸。
如果您碰巧喜欢,可以留言或者私信我,这将是我鼓捣更多优秀文章的最强动力。

Java实现SSH模式加密相关推荐

  1. Java中的AES加密和解密(CBC模式)

    通过有线方式传输诸如纯文本密码之类的机密数据总是容易受到安全性的影响,始终建议对此类信息进行加密并使用SSL传输这些机密数据.Java为此提供了多种加密算法.在本文中,我们将讨论Java中具有CBC模 ...

  2. java des ecb_【转】 java DES ECB模式对称加密解密

    最近需要又要使用DES加密数据,要求DES加密出来的数据为对称加密,经过研究,发现了一些问题: 1.DES对称ECB模式加密的数据,长度必须为8的倍数 2.加密的数据,加密后先转码(因为加密后的数据我 ...

  3. 企业hr管理java,hr Java 企业人事管理系统,利用SSH模式进行开发,能满足一般 的得需求。 Develop 238万源代码下载- www.pudn.com...

    开发工具: Java 文件大小: 880 KB 上传时间: 2015-03-17 下载次数: 4 提 供 者: 王金元 详细说明:Java 企业人事管理系统,利用SSH模式进行开发,能满足一般企业的得 ...

  4. java之php、Android、JAVA、C# 3DES加密解密

    异常如下 1.javax.crypto.BadPaddingException: Given final block not properly padded 1)要确认下是否加密和解密都是使用相同的填 ...

  5. php 3des 兼容java,PHP版3DES加解密类,可与java的3DES(DESede)加密方式兼容

    /** * * PHP版3DES加解密类 * * 可与java的3DES(DESede)加密方式兼容 * * @Author: Luo Hui (farmer.luo at gmail.com) * ...

  6. 转载: java telnet ssh 实现

    原文:http://blog.csdn.net/Code_cj/article/details/6411682 java telnet ssh 实现 2011-05-1113:17 911人阅读 评论 ...

  7. 用poi-3.6-20091214.jar 实现java给excel资料加密

    用poi-3.6-20091214.jar 实现java给excel文件加密 我用了网上的很多方法,但是都没有成功! HSSFWorkbook wb = new HSSFWorkbook(new Fi ...

  8. java AES文件流加密

    java AES文件流加密 文章转载自:https://www.cnblogs.com/gne-hwz/p/14736496.html java工具类-对称加密算法AES 加密文件流 工具类出自jdk ...

  9. java毕业设计—— 基于java+JSP+SSH的任务调度系统设计与实现(毕业论文+程序源码)——任务调度系统

    基于java+JSP+SSH的任务调度系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+JSP+SSH的任务调度系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦. ...

最新文章

  1. Nature年度十大科学人物公布:瑞典气候女孩、北大邓宏魁、谷歌量子计算领导者上榜...
  2. springboot 初始化线程池_springboot项目中线程池的使用
  3. 快嘉开发框架1.0和示例介绍及使用说明
  4. springboot配置log4j
  5. left join 和 inner join
  6. 【转】10分钟精通SharePoint - VS开发模板
  7. 平滑数据迁移,不影响服务
  8. 原始Dao开发方法以及存在的问题
  9. android百分比布局失效,Android 百分比布局库【原创】
  10. mysql 主从的几个参数
  11. robo3t怎么插入数据_robo 3T(robomongo)在ubuntu16.04上安装记录
  12. 学云计算能从事什么工作 云计算就业怎么样
  13. python创意网络爬虫_Python网络爬虫(一)
  14. 智能剪刀——交互式图像分割
  15. 微创电生理通过注册:年营收1.9亿 微创批量生产上市企业
  16. Nat Commun:中国中医科学院黄璐琦院士/首都医科大学高伟教授团队联合解析雷公藤甲素生物合成关键C-14位羟化机制...
  17. 编程求解问题。 若一头小母牛,从出生起第四个年头开始每年生一头小母牛,按此规律,第n年时有多少头小母牛
  18. 测试的步骤(功能测试)
  19. 计算机图像处理怎么学,计算机图像处理在全息学中的应用
  20. model3充电方式_Model3 电池最佳充电和使用详细说明

热门文章

  1. SharePoint2010 内容类型剖析
  2. VS2010中的新特点(上)
  3. jBPM3.12用户指南中文翻译----第一章 绪论
  4. openstack-9:安装neutron网络服务
  5. git克隆远程项目并创建本地对应分支
  6. mysql和mongodb对比互补
  7. linux下安装wpasupplicant及配置
  8. Android架构纵横谈之二—基于性能的考虑(1)
  9. 第二讲:Android系统构架分析和应用程序目录结构分析
  10. 《大话设计模式》勘误