- 浏览: 314696 次
- 性别:
- 来自: 杭州
最新评论
-
wizard_hu:
[i]引用[img][url][flash=200,200][ ...
使用Eclipse Memory Analyzer进行内存泄漏分析三部曲 -
可爱的小狗:
学习了
HttpClient容易忽视的细节——连接关闭 -
xiajunhust:
sqtds 写道文章写的很好,浅显易懂!!! com.taob ...
使用Eclipse Memory Analyzer进行内存泄漏分析三部曲 -
zhylandroid:
使用Eclipse Memory Analyzer进行内存泄漏分析三部曲 -
dsjt:
悲剧啊,google code 被墙了
mybatis3分表插件shardbatis 2.0
Hessian是轻量级的RMI实现使用起来非常的方便,同时与SPRING也结合的非常好。但是在系统中有个比较大的缺陷就是Hessian自身没有解决安全问题。
我在项目的开发中为了解决Hessian的安全问题,在HTTP头中加入了签名信息。
首先要继承HessianProxyFactory在HTTP头中加入时间戳和签名
关键之处就在于openConnection方法覆盖了HessianProxyFactory的openConnection方案在原有的openConnection方法基础上加入了链接超时的设置,及时间戳和签名。
继承HessianProxyFactoryBean使proxyFactory设置为上面的子类实现
dsaService的实现请参考我的另一篇文章《java加入DSA签名》,createSignature方法中签名的明文组成形式是“{时间戳},{密码字符串}”
继承HessianServiceExporter对签名进行校验
覆盖handleRequest方法,在验证通过后再调用父类的handleRequest方法。timeValve为时间戳的校验范围,如果请求到达时间大于这个范围,此请求被认为是非法请求不会再做处理
客户端SPRING配置
服务器端SPRING配置
我在项目的开发中为了解决Hessian的安全问题,在HTTP头中加入了签名信息。
首先要继承HessianProxyFactory在HTTP头中加入时间戳和签名
/** * @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设置为上面的子类实现
/** * @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 <= 0 || StringUtil.isEmptyOrWhitespace(crypt)) { 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对签名进行校验
/** * @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 < 0) { 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配置
<bean id="searchService" class="com.yeatssearch.remote.hessian.YeatsHessianProxyFactoryBean"> <property name="serviceUrl" value="http://localhost:8080/Test/remoting/TestService" /> <property name="serviceInterface" value="com.yeatssearch.test.TestService" /> <property name="readTimeOut" value="30000"/> <property name="connectTimeOut" value="5000"/> <property name="crypt" value="sdfsfdsfsdfsdfsdf"/> <property name="dsaService" ref="dsaService"></property> </bean>
服务器端SPRING配置
<bean name="/TestService" class="com.yeatssearch.remote.hessian.YeatsHessianServiceExporter"> <property name="service" ref="testService" /> <property name="serviceInterface" value="com.yeatssearch.test.TestService" /> <property name="timeValve" value="30000"/> <property name="crypt" value="sdfsfdsfsdfsdfsdf"/> <property name="dsaService" ref="dsaService"/> </bean>
评论
5 楼
yeshucheng
2008-08-05
<p>建议楼主看看hessian源代码,</p>
<p>其实是有的: </p>
<p>X509Signature extends HessianEnvelope</p>
<p> X509Encryption extends HessianEnvelope</p>
<p>其实是有的: </p>
<p>X509Signature extends HessianEnvelope</p>
<p> X509Encryption extends HessianEnvelope</p>
4 楼
melin
2008-08-05
认证好像是通过http basice的方式。加密没有使用过
3 楼
general
2008-08-05
hessian内置的加密和认证如何使用呢?经过多方搜索无果。
2 楼
davis_854
2008-06-30
别扯了,hessian的加密和认证都有的
1 楼
guzhan
2008-03-11
问题是要实现通讯数据的加密而不是简单的调用认证啊
发表评论
-
mybatis3分表插件shardbatis 2.0
2011-07-23 14:08 22189shardbait2.0实现分表的功能可以用一句话描述:使用m ... -
运行Apache Mahout的Taste Webapp例子
2011-07-14 20:00 10408Apache Mahout 是 Apache Soft ... -
编程式配置Spring bean
2011-02-15 23:29 2585今晚翻看了以前写的RPC框架。发现这个框架中编程式配置Spri ... -
JVM Crash原因分析及相关资料
2011-02-14 15:53 15008去年生产环境突然有一天连续发生几台服务器JVM Crash的情 ... -
一次jboss中部署应用时类版本冲突问题分析、解决过程
2011-02-10 10:11 9993去年同事的一个项目在JBOSS中部署时遇到类版本冲突问题,当时 ... -
java nio学习笔记
2011-01-30 00:37 0通道 和 缓冲区 是 NIO 中的核心对象,几乎在每一个 I/ ... -
使用Eclipse Memory Analyzer进行内存泄漏分析三部曲
2011-01-27 14:40 36697一、准备工作 分析较大的dump文件(根据我自己的经验2G以上 ... -
JBoss、Tomcat Classloader不完全分析
2010-12-14 13:25 3837由于平时项目中用到的还是JBoss 4.2.x所以我这里的分析 ... -
通过ibatis实现轻量级的水平切分(已更新,ibatis原生api也可以实现sharding)
2010-08-31 23:07 11809最近想在自己的项目里 ... -
sitemesh性能测试结果比较惊艳(已经补上新的对比测试结果)
2010-07-17 17:03 6753最近想在一个项目中使用sitemesh作为view层的装饰器, ... -
Spring对Quartz的封装实现简单分析及使用注意事项
2010-06-14 14:08 9938前段时间在项目中一直使用正常的Quartz突然出现了任务漏跑的 ... -
Google App Engine for Java 开发笔记
2009-07-25 23:01 1856最近使用GAE开发一个小应用,开发过程中发现几个问题在这里做下 ... -
HttpClient容易忽视的细节——连接关闭
2008-08-30 12:22 130933HttpClient client = new HttpC ... -
java DSA签名实现
2008-03-08 21:50 7235通过以下工具类可以生成DSA公钥和私钥文件 /** * ...
相关推荐
标题中的“Hessian加密传输”指的是使用Hessian协议进行数据传输时的一种安全性增强技术。Hessian是一种二进制RPC(远程过程调用)协议,它提供了简洁高效的序列化方式,常用于服务之间的通信。在传输过程中,为了...
**安全机制** Hessian提供了基于X.509证书的加密和签名机制,这包括`X509Encryption`和`X509Signature`两个类,分别用于加密和解密以及签名和验证。这两种方式可以保证通信的安全性。 对于非X.509证书的加密,用户...
基于java实现hessian进行服务器之间数据交互demo项目 实现功能: 1.基于spring 2.5.6+hessian3.1.6带有签名安全机制 2.基于servlet代理机制实现HessianServlet,进行简单IP地址校验功能!
1. **序列化**:在服务端,Hessian将Java对象转换为二进制流,这个过程称为序列化。 2. **网络传输**:序列化后的二进制流被发送到客户端,通过HTTP协议进行传输。 3. **反序列化**:在客户端,接收到的二进制流被...
例如,安全性的强化可能是一个重点,如加密传输以保护数据安全;也可能提供了更好的错误处理机制,使开发者更容易调试问题。此外,Hessian4.0.7可能支持更多的编程语言,如Python、Ruby等,扩大了Hessian的适用范围...
7. **安全考虑**:在实际应用中,我们需要对Hessian服务进行安全控制,如添加身份验证、授权和加密机制。Spring Security可以与Hessian整合,提供安全的远程服务访问。 8. **测试与监控**:为了确保服务的稳定性和...
在IT行业中,Hessian是一种基于二进制协议的RPC(远程过程调用)框架,它使得客户端和服务端之间能够高效地进行数据...然而,实现一个健壮的Hessian服务端还需要关注安全性、版本兼容性、性能优化和监控等多个方面。
Hessian是一种二进制Web服务协议,由Caucho Technology公司开发,主要用于提供轻量级、高效的远程方法调用(Remote Method Invocation, RMI)机制。它结合了HTTP协议的可扩展性和Java序列化机制的易用性,使得在...
在安全方面,Hessian可以通过HTTPS与SSL/TLS进行加密,确保数据传输的安全性。不过,需要注意的是,Hessian本身并不提供身份验证和授权机制,这些通常需要在更高层的应用或网络基础设施中实现。 在实际应用中,...
Hessian的核心是其序列化和反序列化机制。序列化是将Java对象转换为二进制流的过程,而反序列化则是将二进制流还原为Java对象。Hessian协议定义了一套规则,用于表示各种数据类型,包括基本类型、字符串、日期、集合...
Hessian是一种高效的序列化协议,它将Java对象转换为二进制流,通过网络传输,然后在另一端还原为原来的对象。相比基于文本的XML或JSON,Hessian传输的数据量更小,性能更高。 在Dubbo中,Hessian协议被用于服务间...
通过简单的API,开发者可以轻松地创建服务端接口并暴露为Hessian服务,同时在客户端通过HessianProxyFactory来创建代理对象,调用远程服务就像调用本地方法一样。 3. **Python中的Hessian**:Python也有对应的...
Hessian提供了序列化和反序列化的机制,使得对象可以被编码为字节流,并在网络间传输,然后在接收端解码回原生的对象形式。 在“hessian简单实例”中,我们有两个关键部分:`hessian-server`和`hessian-client`。`...
Hessian协议的核心是它的二进制编码,这种编码方式能够将Java对象转换为紧凑的字节序列。在服务调用时,客户端通过HTTP发送一个Hessian编码的请求到服务端,服务端接收并解码这个请求,执行相应的服务方法,然后返回...
它提供了高效的远程调用能力,相比基于文本的协议(如SOAP),Hessian能更节省带宽和提高通信效率。Hessian库可以在不同平台上使用,支持多种编程语言,简化了跨语言的远程服务调用。 WebService是一种基于XML的、...
Hessian的目标是提供一个轻量级、高效的序列化和通信机制,使得对象能够在网络间透明地进行传输。在这个案例代码中,我们将探讨Hessian如何工作以及如何在实际项目中应用。 首先,Hessian协议的特点在于它的二进制...
- 考虑安全性问题,Hessian默认不加密传输,可以通过HTTPS或自定义Filter增强安全性。 通过上述配置,我们可以实现Spring中基于Hessian的RPC通信,使得服务间的调用变得高效且简单。`HelloHessianService`和`...
2. **服务端实现**:在服务端,开发者通常会创建一个Hessian服务,将Java对象的方法暴露为Web服务。Caucho Technology提供了Hessian服务器端库,可以方便地集成到Java应用程序服务器中。 3. **客户端调用**:在...