为Hessian加入加密签名的安全机制

为Hessian加入加密签名的安全机制

博客分类:java

SpringXMLJDK

Hessian是轻量级的RMI实现使用起来非常的方便,同时与SPRING也结合的非常好。但是在系统中有个比较大的缺陷就是Hessian自身没有解决安全问题。

我在项目的开发中为了解决Hessian的安全问题,在HTTP头中加入了签名信息。

首先要继承HessianProxyFactory在HTTP头中加入时间戳和签名

Java代码

/**

* @author Buffon

*

*/

public class YeatsHessianProxyFactory extends HessianProxyFactory {

private long connectTimeOut = 0;

private String signature;

private long timeStamp;

/**

* @return signature

*/

public String getSignature() {

return signature;

}

/**

* @param signature

*            要设置的 signature

*/

public void setSignature(String signature) {

this.signature = signature;

}

/**

* @return connectTimeOut

*/

public long getConnectTimeOut() {

return connectTimeOut;

}

/**

* @param connectTimeOut

*            要设置的 connectTimeOut

*/

public void setConnectTimeOut(long connectTimeOut) {

this.connectTimeOut = connectTimeOut;

}

public URLConnection openConnection(URL url) throws IOException {

URLConnection conn = super.openConnection(url);

if (connectTimeOut > 0) {

try {

// only available for JDK 1.5

Method method = conn.getClass().getMethod("setConnectTimeout",

new Class[] { int.class });

if (method != null)

method.invoke(conn, new Object[] { new Integer(

(int) connectTimeOut) });

} catch (Throwable e) {

}

}

if (!StringUtil.isEmptyOrWhitespace(this.signature)) {

conn.setRequestProperty("Yeats-Signature", this.signature);

}

if (this.timeStamp > 0) {

conn.setRequestProperty("Yeats-Timestamp", Long

.toString(this.timeStamp));

}

return conn;

}

/**

* @return timeStamp

*/

public long getTimeStamp() {

return timeStamp;

}

/**

* @param timeStamp

*            要设置的 timeStamp

*/

public void setTimeStamp(long timeStamp) {

this.timeStamp = timeStamp;

}

}

关键之处就在于openConnection方法覆盖了HessianProxyFactory的openConnection方案在原有的openConnection方法基础上加入了链接超时的设置,及时间戳和签名。

继承HessianProxyFactoryBean使proxyFactory设置为上面的子类实现

Java代码

/**

* @author Buffon

*

*/

public class YeatsHessianProxyFactoryBean extends HessianProxyFactoryBean {

private YeatsHessianProxyFactory proxyFactory = new YeatsHessianProxyFactory();

private long readTimeOut;

private long connectTimeOut;

private String crypt;

private DSA dsaService;

/**

* @return crypt

*/

public String getCrypt() {

return crypt;

}

/**

* @param crypt

*            要设置的 crypt

*/

public void setCrypt(String crypt) {

this.crypt = crypt;

}

/**

* @return connectTimeOut

*/

public long getConnectTimeOut() {

return connectTimeOut;

}

/**

* @param connectTimeOut

*            要设置的 connectTimeOut

*/

public void setConnectTimeOut(long connectTimeOut) {

this.connectTimeOut = connectTimeOut;

}

/**

* @return readTimeOut

*/

public long getReadTimeOut() {

return readTimeOut;

}

/**

* @param readTimeOut

*            要设置的 readTimeOut

*/

public void setReadTimeOut(long readTimeOut) {

this.readTimeOut = readTimeOut;

}

public void afterPropertiesSet() {

proxyFactory.setReadTimeout(readTimeOut);

proxyFactory.setConnectTimeOut(connectTimeOut);

long timeStamp = new Date().getTime();

proxyFactory.setTimeStamp(timeStamp);

try {

proxyFactory.setSignature(this.createSignature(timeStamp,

this.crypt));

} catch (Exception e) {

}

setProxyFactory(proxyFactory);

super.afterPropertiesSet();

}

private String createSignature(long timeStamp, String crypt)

throws Exception {

if (timeStamp

throw new Exception("timestamp or crypt is invalied");

}

StringBuilder sb = new StringBuilder();

sb.append("{");

sb.append(timeStamp);

sb.append("},{");

sb.append(crypt);

sb.append("}");

return dsaService.sign(sb.toString());

}

/**

* @return dsaService

*/

public DSA getDsaService() {

return dsaService;

}

/**

* @param dsaService 要设置的 dsaService

*/

public void setDsaService(DSA dsaService) {

this.dsaService = dsaService;

}

}

dsaService的实现请参考我的另一篇文章《java加入DSA签名》,createSignature方法中签名的明文组成形式是“{时间戳},{密码字符串}”

继承HessianServiceExporter对签名进行校验

Java代码

/**

* @author Buffon

*

*/

public class YeatsHessianServiceExporter extends HessianServiceExporter {

private static final Log log = LogFactory.getLog(YeatsHessianServiceExporter.class);

private DSA dsaService;

private String crypt;

private long timeValve;

public void handleRequest(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

String signature = request.getHeader("Yeats-Signature");

String timestamp = request.getHeader("Yeats-Timestamp");

if (StringUtil.isEmptyOrWhitespace(signature)) {

log.error("Can't get signature");

throw new ServletException("Can't get signature");

}

if (StringUtil.isEmptyOrWhitespace(timestamp)) {

log.error("Cant't get timestamp");

throw new ServletException("Cant't get timestamp");

}

long now = new Date().getTime();

long range = now - Long.parseLong(timestamp);

if (range

range = -range;

}

if (range > timeValve) {

log.error("Timestamp is timeout");

throw new ServletException("Timestamp is timeout");

}

StringBuilder sb = new StringBuilder();

sb.append("{");

sb.append(timestamp);

sb.append("},{");

sb.append(crypt);

sb.append("}");

try {

if (dsaService.verify(signature, sb.toString())) {

super.handleRequest(request, response);

} else {

log.error("No permission");

throw new ServletException("No permission");

}

} catch (Exception e) {

log.error("Failed to process remote request!", e);

throw new ServletException(e);

}

}

/**

* @return dsaService

*/

public DSA getDsaService() {

return dsaService;

}

/**

* @param dsaService

*            要设置的 dsaService

*/

public void setDsaService(DSA dsaService) {

this.dsaService = dsaService;

}

/**

* @return crypt

*/

public String getCrypt() {

return crypt;

}

/**

* @param crypt

*            要设置的 crypt

*/

public void setCrypt(String crypt) {

this.crypt = crypt;

}

/**

* @return timeValve

*/

public long getTimeValve() {

return timeValve;

}

/**

* @param timeValve

*            要设置的 timeValve

*/

public void setTimeValve(long timeValve) {

this.timeValve = timeValve;

}

}

覆盖handleRequest方法,在验证通过后再调用父类的handleRequest方法。timeValve为时间戳的校验范围,如果请求到达时间大于这个范围,此请求被认为是非法请求不会再做处理

客户端SPRING配置

Xml代码

class="com.yeatssearch.remote.hessian.YeatsHessianProxyFactoryBean">

value="http://localhost:8080/Test/remoting/TestService" />

value="com.yeatssearch.test.TestService" />

服务器端SPRING配置

Xml代码

class="com.yeatssearch.remote.hessian.YeatsHessianServiceExporter">

value="com.yeatssearch.test.TestService" />

分享到:

为Hessian加入加密签名的安全机制

博客分类:java

SpringXMLJDK

Hessian是轻量级的RMI实现使用起来非常的方便,同时与SPRING也结合的非常好。但是在系统中有个比较大的缺陷就是Hessian自身没有解决安全问题。

我在项目的开发中为了解决Hessian的安全问题,在HTTP头中加入了签名信息。

首先要继承HessianProxyFactory在HTTP头中加入时间戳和签名

Java代码

/**

* @author Buffon

*

*/

public class YeatsHessianProxyFactory extends HessianProxyFactory {

private long connectTimeOut = 0;

private String signature;

private long timeStamp;

/**

* @return signature

*/

public String getSignature() {

return signature;

}

/**

* @param signature

*            要设置的 signature

*/

public void setSignature(String signature) {

this.signature = signature;

}

/**

* @return connectTimeOut

*/

public long getConnectTimeOut() {

return connectTimeOut;

}

/**

* @param connectTimeOut

*            要设置的 connectTimeOut

*/

public void setConnectTimeOut(long connectTimeOut) {

this.connectTimeOut = connectTimeOut;

}

public URLConnection openConnection(URL url) throws IOException {

URLConnection conn = super.openConnection(url);

if (connectTimeOut > 0) {

try {

// only available for JDK 1.5

Method method = conn.getClass().getMethod("setConnectTimeout",

new Class[] { int.class });

if (method != null)

method.invoke(conn, new Object[] { new Integer(

(int) connectTimeOut) });

} catch (Throwable e) {

}

}

if (!StringUtil.isEmptyOrWhitespace(this.signature)) {

conn.setRequestProperty("Yeats-Signature", this.signature);

}

if (this.timeStamp > 0) {

conn.setRequestProperty("Yeats-Timestamp", Long

.toString(this.timeStamp));

}

return conn;

}

/**

* @return timeStamp

*/

public long getTimeStamp() {

return timeStamp;

}

/**

* @param timeStamp

*            要设置的 timeStamp

*/

public void setTimeStamp(long timeStamp) {

this.timeStamp = timeStamp;

}

}

关键之处就在于openConnection方法覆盖了HessianProxyFactory的openConnection方案在原有的openConnection方法基础上加入了链接超时的设置,及时间戳和签名。

继承HessianProxyFactoryBean使proxyFactory设置为上面的子类实现

Java代码

/**

* @author Buffon

*

*/

public class YeatsHessianProxyFactoryBean extends HessianProxyFactoryBean {

private YeatsHessianProxyFactory proxyFactory = new YeatsHessianProxyFactory();

private long readTimeOut;

private long connectTimeOut;

private String crypt;

private DSA dsaService;

/**

* @return crypt

*/

public String getCrypt() {

return crypt;

}

/**

* @param crypt

*            要设置的 crypt

*/

public void setCrypt(String crypt) {

this.crypt = crypt;

}

/**

* @return connectTimeOut

*/

public long getConnectTimeOut() {

return connectTimeOut;

}

/**

* @param connectTimeOut

*            要设置的 connectTimeOut

*/

public void setConnectTimeOut(long connectTimeOut) {

this.connectTimeOut = connectTimeOut;

}

/**

* @return readTimeOut

*/

public long getReadTimeOut() {

return readTimeOut;

}

/**

* @param readTimeOut

*            要设置的 readTimeOut

*/

public void setReadTimeOut(long readTimeOut) {

this.readTimeOut = readTimeOut;

}

public void afterPropertiesSet() {

proxyFactory.setReadTimeout(readTimeOut);

proxyFactory.setConnectTimeOut(connectTimeOut);

long timeStamp = new Date().getTime();

proxyFactory.setTimeStamp(timeStamp);

try {

proxyFactory.setSignature(this.createSignature(timeStamp,

this.crypt));

} catch (Exception e) {

}

setProxyFactory(proxyFactory);

super.afterPropertiesSet();

}

private String createSignature(long timeStamp, String crypt)

throws Exception {

if (timeStamp

throw new Exception("timestamp or crypt is invalied");

}

StringBuilder sb = new StringBuilder();

sb.append("{");

sb.append(timeStamp);

sb.append("},{");

sb.append(crypt);

sb.append("}");

return dsaService.sign(sb.toString());

}

/**

* @return dsaService

*/

public DSA getDsaService() {

return dsaService;

}

/**

* @param dsaService 要设置的 dsaService

*/

public void setDsaService(DSA dsaService) {

this.dsaService = dsaService;

}

}

dsaService的实现请参考我的另一篇文章《java加入DSA签名》,createSignature方法中签名的明文组成形式是“{时间戳},{密码字符串}”

继承HessianServiceExporter对签名进行校验

Java代码

/**

* @author Buffon

*

*/

public class YeatsHessianServiceExporter extends HessianServiceExporter {

private static final Log log = LogFactory.getLog(YeatsHessianServiceExporter.class);

private DSA dsaService;

private String crypt;

private long timeValve;

public void handleRequest(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

String signature = request.getHeader("Yeats-Signature");

String timestamp = request.getHeader("Yeats-Timestamp");

if (StringUtil.isEmptyOrWhitespace(signature)) {

log.error("Can't get signature");

throw new ServletException("Can't get signature");

}

if (StringUtil.isEmptyOrWhitespace(timestamp)) {

log.error("Cant't get timestamp");

throw new ServletException("Cant't get timestamp");

}

long now = new Date().getTime();

long range = now - Long.parseLong(timestamp);

if (range

range = -range;

}

if (range > timeValve) {

log.error("Timestamp is timeout");

throw new ServletException("Timestamp is timeout");

}

StringBuilder sb = new StringBuilder();

sb.append("{");

sb.append(timestamp);

sb.append("},{");

sb.append(crypt);

sb.append("}");

try {

if (dsaService.verify(signature, sb.toString())) {

super.handleRequest(request, response);

} else {

log.error("No permission");

throw new ServletException("No permission");

}

} catch (Exception e) {

log.error("Failed to process remote request!", e);

throw new ServletException(e);

}

}

/**

* @return dsaService

*/

public DSA getDsaService() {

return dsaService;

}

/**

* @param dsaService

*            要设置的 dsaService

*/

public void setDsaService(DSA dsaService) {

this.dsaService = dsaService;

}

/**

* @return crypt

*/

public String getCrypt() {

return crypt;

}

/**

* @param crypt

*            要设置的 crypt

*/

public void setCrypt(String crypt) {

this.crypt = crypt;

}

/**

* @return timeValve

*/

public long getTimeValve() {

return timeValve;

}

/**

* @param timeValve

*            要设置的 timeValve

*/

public void setTimeValve(long timeValve) {

this.timeValve = timeValve;

}

}

覆盖handleRequest方法,在验证通过后再调用父类的handleRequest方法。timeValve为时间戳的校验范围,如果请求到达时间大于这个范围,此请求被认为是非法请求不会再做处理

客户端SPRING配置

Xml代码

class="com.yeatssearch.remote.hessian.YeatsHessianProxyFactoryBean">

value="http://localhost:8080/Test/remoting/TestService" />

value="com.yeatssearch.test.TestService" />

服务器端SPRING配置

Xml代码

class="com.yeatssearch.remote.hessian.YeatsHessianServiceExporter">

value="com.yeatssearch.test.TestService" />

分享到:


相关文章

  • 信息安全概论加密算法论文
  • 随着信息时代的到来,特别是随着Internet和电子商务的发展,怎样才能达到使信息系统的机密信息难以被泄漏,或者即使被窃取了也极难识别,以及即使被识别了也极难篡改,已经成为IT业界的热点研究课题.到现在为止网络安全解决方案可以分为两大类:一 ...查看


  • 网络安全与管理(3344)
  • 第一章:网络安全概述: 1.什么是网络安全?P2 答:网络安全是指保护网络系统中的软件.硬件及信息资源,使之免受偶然或恶意的破坏.篡改和漏露,保证网络系统的正常运行.网 络服务不中断. 2.网络安全具备哪五个方面特 征?P2 答:可用性.机 ...查看


  • 电子商务的安全要素及其标准规范
  • 追赶人生--记录人生旅程 网站首页 | 网页地图 | 留言本 | 精华美文 | 资料课件论文下载 |关于wished.cn| google adsense 电子商务的安全要素及其标准规范 摘自<信息网络安全>杂志 2002年第九 ...查看


  • 基于身份的天地一体化测控网络安全服务研究
  • 基于身份的天地一体化测控网络安全服务研究 彭长艳沈亚敏王剑 (国防科技大学电子科学与工程学院・湖南长沙・410073) 摘要总结了航天测控网的发展现状,分析了未来天地一体化的航天互联网的发展目标,讨论了空间网络的体系结构和网络通信协议.归纳 ...查看


  • 电子商务安全 名词概念及简答
  • 1. 简述信息安全的属性 信息安全的属性:保密性.完整性.可用性.可控性.不可否认性. 含义:保密性:保证信息不泄露给未经授权的人. 完整性:防止信息被未经授权的人(实体)篡改,保证真实的信息从真实的信源无失真地到达真实的信宿. 可用性:保 ...查看


  • 电子商务的安全技术-数字签名
  • 电子商务的安全技术--数字签名 专业:信息管理与信息系统 班级:信管本科班 学号: 姓名: 日期:2015年6月30日 摘要:近来基于Internet 开展的电子商务已逐渐成为人们进行商务活动的新模式.越来 越多的人通过 Internet ...查看


  • 河北科技大学研究生学位论文格式及范文
  • 中图分类号: 密级: 公开 学校代码: 10082 UDC: 硕士学位论文 强辐射下核电阀门电控系统的可靠性研究 论文作者: 陈腾 指导教师: 孙鹤旭 教授 企业指导教师: 申请学位类别: 控制工程硕士 学科.领域: 控制工程 所在单位: ...查看


  • [密码学引论]第二版重点 武汉大学
  • 一.信息系统安全包括四个侧面:设备安全,数据安全,内容安全,行为安全. 设备安全:是指确保信息设备的稳定性.可靠性和可用性,这里的设备包括软件和硬件. 数据安全:包括数据的秘密性.数据的真实性和数据的完整性3个侧面. 行为安全:包括行为秘密 ...查看


  • 苏州大学物联网信息安全期末考题
  • 物联网信息安全 一.选择 1.以下加密法中属于双钥密码体制的是__D___ A.DES B.AES C.IDEA D.ECC 2.Internet上很多软件的签名认证都来自___D____公司. A.Baltimore B.Entrust ...查看


热门内容