`
sunney2010
  • 浏览: 59347 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Hessian接口调用时的DSA 加密(转)

    博客分类:
  • java
阅读更多
转载只是为了学习,我还得试一下行不行。呵呵。
来源:http://dingjob.iteye.com/blog/689073

   我们经常会使用hessian接口,但是hessian接口默认的情况下是不会进行加密的,原来在项目中使用了MD5的加密,这次希望通过DSA 加密解决 C- S的安全通讯,一方面确定客户端是有权限调用的(给出了publicKey),另一方面保证传输的数据安全

  基本思路就是采用 新的HessianProxyFactory和 HessianServiceExporter 代替原来的发送和接收端,发送请求时进行私钥加密,接收时进行公钥的解密。

  基本逻辑实现如下:

/** 
 * 实现带加密功能的hessian client 
 *  
 * <pre> 
 * 结合spring hessian使用,使用DSAHessianProxyFactory替换默认的HessianProxyFactory 
 * &lt;bean id=&quot;heessianClient&quot; class=&quot;org.springframework.remoting.caucho.HessianProxyFactoryBean&quot;&gt; 
 *      &lt;property name=&quot;proxyFactory&quot;&gt; 
 *          &lt;bean class=&quot;com.alibaba.pivot.common.hessian.DSAHessianProxyFactory&quot;&gt; 
 *              &lt;property name=&quot;secureKey&quot; value=&quot;xxxxx&quot;/&gt; 
 *          &lt;/bean&gt; 
 *      &lt;/property&gt; 
 * &lt;/bean&gt; 
 * </pre> 
 *  
 * @author job 2010-01-28 上午10:20:01 
 */  
public class DSAHessianProxyFactory extends HessianProxyFactory {  
  
    private static final Logger log = LoggerFactory.getLogger(DSAHessianProxyFactory.class);  
  
    private DSAService          dsaService;  
  
    private String     keyPairName;  
  
    /** 
     * 固定的加密字符串 
     */  
    private String              secureKey;  
  
    protected URLConnection openConnection(URL url) throws IOException {  
        String signature = null;  
        String baseUrl = url.toString();  
        StringBuilder queryBuilder = new StringBuilder();  
        queryBuilder.append(baseUrl);  
  
        // 生成时间戳  
        long timestamp = System.currentTimeMillis();  
        // 生成方法签名  
        try {  
            signature = dsaService.sign(secureKey + "|" + Long.toString(timestamp), keyPairName);  
        } catch (NoSuchKeyPairException ne) {  
            log.error("error in DSAHessianProxyFactory.openConnection,no such key" + keyPairName, ne);  
        } catch (DSAException de) {  
            log.error("error in DSAHessianProxyFactory.openConnection,DSA sign error" + keyPairName, de);  
        }  
        if (!"?".equals(queryBuilder.charAt(queryBuilder.length() - 1))) {  
            queryBuilder.append("?");  
        }  
  
        queryBuilder.append("sign=");  
        if (signature != null) {  
            queryBuilder.append(StringEscapeUtil.escapeURL(signature));  
        }  
        queryBuilder.append("&time=");  
        queryBuilder.append(timestamp);  
        URL secureUrl = new URL(queryBuilder.toString());  
  
        URLConnection conn = secureUrl.openConnection();  
  
        conn.setDoOutput(true);  
  
        if (getReadTimeout() > 0) {  
            try {  
                conn.setReadTimeout((int) getReadTimeout());  
            } catch (Throwable e) {  
            }  
        }  
        // 设置自定义的content-type  
        conn.setRequestProperty("Content-Type", "application/octet-stream");  
  
        return conn;  
    }  


输出时的加密:

 
/** 
 * 处理加密的hessian server, 代码来自pivot-p4p 
 *  
 * <pre> 
 * 1. timeout 设置超时时间,单位秒. (客户端会在每次请求中添加时间戳,如果设置了该值,就会进行对客户端请求时间是否超时进行验证) 
 * 2. secureKey 服务端密钥串 (如果设置了该值,就会进行对客户端请求加密串进行验证) 
 * 3. allowedClients 客户端IP验证 (如果设置了该值,就会进行对客户端请求IP进行验证) 
 * </pre> 
 *  
 * @author job 2010-01-28 上午09:53:02 
 */  
public class DSAHessianServiceExporter extends HessianServiceExporter {  
  
    private static Logger log = LoggerFactory.getLogger(DSAHessianServiceExporter.class);  
  
    /** 请求过期时间 **/  
    private long          timeout;  
    /** 令牌原文 **/  
    private String        secureKey;  
    /** 允许访问的客户端 **/  
    private String        allowedClients;  
    /** dsa 加密服务 **/  
    private DSAService    dsaService;  
    /** 密钥名称 **/  
    private String        keyPairName;  
  
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException,  
                                                                                       IOException {  
        // 1.如果设置了允许的IP地址,需要进行客户端IP地址验证  
        if (StringUtil.isNotBlank(allowedClients)) {  
            String clientIP = getClientIPAddress(request);  
            if (!isAllowedClient(clientIP)) {  
                log.error("hessian authentication error:" + clientIP + " not in allowedList " + allowedClients);  
                return;  
            }  
        }  
  
        // 2.如果设置了令牌或者过期时间,需要判断时间格式是否合法  
        String strTimestamp = request.getParameter("time");  
        long timestamp = 0;  
        if (timeout > 0 || StringUtil.isNotBlank(secureKey)) {  
            if (strTimestamp == null) {  
                log.error("hessian authentication error:timestamp not exist!");  
                return;  
            }  
            try {  
                timestamp = Long.parseLong(strTimestamp);  
            } catch (NumberFormatException e) {  
                log.error("hessian authentication error:timestamp is not number!");  
                return;  
            }  
        }  
  
        // 3.如果设置了过期时间,需要判断请求是否过期  
        if (timeout > 0) {  
            // 判断请求是否过期  
            if (isRequestExpired(timestamp)) {  
                log.error("hessian authentication error:request is expired!");  
                return;  
            }  
        }  
  
        // 4. 如果设置了令牌,需要进行签名校验  
        if (StringUtil.isNotBlank(secureKey)) {  
            // 4.1 得到签名  
            String signature = request.getParameter("sign");  
            if (signature == null) {  
                log.error("hessian authentication error:signatures not exist!");  
                return;  
            }  
            try {  
                // 4.2 验证签名是否一致  
                boolean isRight = dsaService.check(secureKey + "|" + timestamp, signature, keyPairName);  
                if (!isRight) {  
                    log.error("hessian authentication error:signatures not match!");  
                    return;  
                }  
            } catch (NoSuchKeyPairException ne) {  
                log.error("error in DSAHessianServiceExporter.handleRequest,no such key" + keyPairName, ne);  
            } catch (DSAException de) {  
                log.error("error in DSAHessianServiceExporter.handleRequest,DSA sign error", de);  
            }  
  
        }  
        // 5. 设置hessian context-type  
        response.setContentType("application/octet-stream");  
        super.handleRequest(request, response);  
    }  

分享到:
评论

相关推荐

    hessian接口性能测试

    用LR对hessian接口做性能测试,使用JAVA协议,没有界面的性能测试

    java+hessian 远程调用

    Java Hessian远程调用是一种高效的、轻量级的RPC(Remote Procedure Call)解决方案,它允许Java应用程序通过网络进行跨语言的通信。Hessian是BEA Systems开发的一种二进制Web服务协议,它提供了序列化和远程方法...

    业务系统增加hessian接口解决方案

    在Spring+iabtis框架中,增加hessian接口,要实现以下几点: 1.绕过系统本身的认证,拦截器直接将该实现方法的servlet直接调用,需要重写拦截器。 2.由于绕过了spring和Struts,请求没有经过封装的事物管理器实例化,...

    Hessian远程调用框架学习一

    Hessian远程调用框架是基于Java的轻量级RPC(Remote Procedure Call)解决方案,它允许开发者在分布式系统中实现高效、便捷的跨网络对象方法调用。本教程将引导你入门Hessian,通过一个简单的JAVA demo来理解其工作...

    Hessian Binary Web Service Protocol远程接口调用入门Demo

    本教程将通过一个入门Demo来介绍如何使用Hessian进行远程接口调用。 首先,让我们理解Hessian的优势。与XML-RPC相比,Hessian使用二进制编码,因此在网络传输时占用的带宽更少,解析速度更快。此外,Hessian支持...

    hessian实现远程调用

    Hessian是Apache项目下的一个轻量级的RPC(Remote Procedure Call,远程过程调用)框架,它提供了一种高效的二进制协议,用于在网络之间传递Java对象。下面我们将详细介绍Hessian的实现原理以及如何在实际开发中运用...

    Hessian加密传输

    标题中的“Hessian加密传输”指的是使用Hessian协议进行数据传输时的一种安全性增强技术。Hessian是一种二进制RPC(远程过程调用)协议,它提供了简洁高效的序列化方式,常用于服务之间的通信。在传输过程中,为了...

    Hessian 接口 Java Python.docx

    在Java和Python之间实现接口时,Hessian起着关键作用。通过使用Hessian,开发者可以创建远程过程调用(RPC)服务,就像创建一个Servlet一样简单。客户端使用服务也只需要一个JDK的代理接口,大大简化了跨语言交互的...

    Hessian远程调用RPC最简单demo

    本教程将详细介绍"Hessian远程调用RPC最简单demo",包括服务器端服务发布和客户端服务调用的实现,以及所需资源。 首先,我们来看一下`hessian-4.0.7.jar`这个文件。这是Hessian库的核心组件,包含了实现Hessian...

    hessian接口包

    开发者可以使用这些组件来创建一个客户端,调用服务端的Hessian接口,进行性能测试,如调用延迟、并发处理能力等。在测试过程中,可以利用`hkcss-client-1.0-SNAPSHOT.jar`和`hkss-common-1.0-SNAPSHOT.jar`来构建...

    Hessian调用

    同时,Hessian还支持版本控制和安全特性,可以确保服务升级不影响现有调用,且可以通过认证和加密保护通信的安全。 总的来说,Hessian调用是一种便捷高效的远程调用方式,它简化了Java应用之间的通信,减少了网络...

    外部接口调用 使用spring4+hessian4实例

    标题 "外部接口调用 使用spring4+hessian4实例" 提供了一个关于如何使用Spring4框架与Hessian4库实现远程服务调用的具体实践。在这个场景中,Hessian4被用作一个轻量级的RPC(远程过程调用)协议,它允许应用程序在...

    hessian-4.0.33.jar

    2. Hessian服务端:实现了Hessian协议的服务端接口,允许开发者创建远程服务并暴露给客户端调用。 3. Hessian客户端:提供了客户端接口,可以调用远程服务,获取服务返回的结果。 4. 类型映射:定义了不同语言之间...

    Hessian 使用小结

    对于非X.509证书的加密,用户需要自定义类继承`HessianEnvelope`,并实现`wrap(Hessian2Output)`,`unwrap(Hessian2Input)`和`unwrapHeaders(Hessian2Input)`接口,以实现自己的加密逻辑。 **封装工具包** 虽然在...

    外部接口调用 使用spring4+hessian4实例(二)

    标题中的“外部接口调用 使用spring4+hessian4实例(二)”指的是使用Spring框架的版本4和Hessian库的版本4来实现远程服务调用的一种实践案例。在这个实例中,我们将探讨如何利用这两个组件来构建分布式系统中的服务...

Global site tag (gtag.js) - Google Analytics