`
blueyanghualong
  • 浏览: 228575 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

自己写的一个Http鉴权Demo

阅读更多

 

package cn.com.superv.ead.common.httpAuth.comm;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.Properties;
import java.util.ResourceBundle;

import cn.com.superv.ead.common.ClientInitConf;

import sun.misc.BASE64Encoder;

/**
 * 此类提供一些支撑HttpAuth 认证的工具方法
 * @author yang,hualong
 *
 */
public class UtilHttpAuth {
	public final static int BASIC_AUTHEM=1;
	public final static int DIGEST_AUTHEM=2;

	public final static String AUTH = "Authorization";
	public final static String BASIC = "Basic";
	public final static String DIGEST = "Digest";
	/*以下是digest请求需要的参数*/
	public final static String USERNAME="username";
	public final static String REALM="realm";
	public final static String QOP="qop";
	public final static String NONCE="nonce";
	public final static String CNONCE="cnonce";
	public final static String NCVALUE="nc";
	public final static String RESPONSE="response";
	public final static String URI="uri";
	
  /*  以下是配置对其配置文件信息*/
    public final static String AUTHENTICATIONMODE = "user.authenticationmode";
    public final static String USER_USERNAME = "user.username";
    public final static String PASSWORD = "user.password";
    public final static String PROPERTIES_FILE_PATH="system";
	
	/**
	 * 此方法用于加密Str 串
	 * @author yang,hualong
	 * @param value
	 * @return
	 */
	public static String getBASE64(String value)
     {
       if(value == null)
         return null;
       BASE64Encoder BaseEncode = new BASE64Encoder();
       return(BaseEncode.encode(value.getBytes()));
     }

	public static String calcMD5(String str)
	     {
	       try {
	         MessageDigest alga = MessageDigest.getInstance("MD5");
	         alga.update(str.getBytes());
	         byte[] digesta = alga.digest();
	         return byte2hex(digesta);
	       }
	       catch (NoSuchAlgorithmException ex) {
	         //System.out.println("出错了!!");
	       }
	       return "NULL";
	     }
	
	 private static String byte2hex(byte[] b)
     {
       String hs = "";
       String stmp = "";
       for (int n = 0; n < b.length; n++) {
         stmp = (Integer.toHexString(b[n] & 0XFF));
         if (stmp.length() == 1)
           hs = hs + "0" + stmp;
         else
           hs = hs + stmp;
         if (n < b.length - 1)
           hs = hs + "";
       }
       return hs;
     }
	
	/**
	    * 写一个截取需要Basic认证的字符串的方法 
	    * @param subKeyWord
	    * @param basic
	    * @return
	    * 如果不存在当前子串则直接返回null;
	    */
	public static String getBasicAuthInfo(String httpAuthKeyWord) {
        String basic;
		int index1 = httpAuthKeyWord.indexOf(AUTH);
		int index2 = httpAuthKeyWord.indexOf("\r\n", index1);
		int index = index1 + AUTH.length() + 1;
		if (index1 == -1 || index2 == -1||index==-1) {
			return null;
		}
		basic = httpAuthKeyWord.substring(index, index2);
		if (basic.indexOf(BASIC) == -1) {
			return null;
		}
		return basic;
	}
	/**
	    * 写一个截取需要Digetst认证的字符串的方法 
	    * @param subKeyWord
	    * @param basic
	    * @return
	    * 如果不存在当前子串则直接返回null;
	    */
	public static String getDigestAuthInfo(String httpAuthKeyWord) {
        String digest;
		int index1 = httpAuthKeyWord.indexOf(AUTH);
		int index2 = httpAuthKeyWord.indexOf("\r\n", index1);
		int index = index1 + AUTH.length() + 1;
		if (index1 == -1 || index2 == -1) {
			return null;
		}
		if(index==-1){
			return null;
		}
		digest = httpAuthKeyWord.substring(index, index2);
		if (digest.indexOf(DIGEST) == -1) {
			return null;
		}
		return digest;
	}
	/**
	 * 获取 digest类型请求param
	 * @author yang,hualong
	 * @param digestParam 需要查找的字符串
	 * @param digest  digest类型字符串
	 * @return
	 */
	public static String getDigestParam(String digest, String digestParam) {
		int index1, index2 = 0;
		/* 校验username */
		if (digest == null || digestParam ==null) {
			return null;
		}
		if ((index1 = digest.indexOf(digestParam + "=\"")) == -1) {
			return null;
		}
		index1 = index1 + new String(digestParam + "=\"").length();
		if ((index2 = digest.indexOf("\"", index1)) == -1) {
			return null;
		}
		return digest.substring(index1, index2);
	}
       /*以下部分用于读取配置文件中的信息*/
	    public static String getAuthenticationMode(String authenticationMode){
	    	return ClientInitConf.getEcitsConf(authenticationMode);
	    }
	    public static String getUsername(String username){
	    	return ClientInitConf.getEcitsConf(username);
	    }
	    public static String getPassword(String password){
	    	return ClientInitConf.getEcitsConf(password);
	    }
	public static void main(String[] args) {
		//验证Basic信息的方法
		System.out.println("javaind\r\n");
		String authBasicInfo=getDigestAuthInfo("AuthorizationjavaabWVhY2hhbHlhbmc6bWVhY2hhbHlhbm\"c=dddddddddddddddddusername=\"fffffff\"fffDigestffff\"ffffffff\"fffff\r\nfffff\"ffffffffffffffffffffffff");
		String test="dddddddddddddddddusername=\"fffffff3333333333333\"  ";
	//	getDigestParam(test,"username");
		System.out.println(getDigestParam(test,"username"));
	}
	}

   /**

	 * 此方用于请求的Http鉴权认证
	 * @author yang,hualong
	 * @param res
	 * @param baos
	 * @param nc   
	 */
	private void httpAuthentication(HttpServletResponse res,
			ByteArrayOutputStream baos, int nc) {
		// 获取配置文件中的HttpAuth属性
		String AuthenticationMode=UtilHttpAuth.getAuthenticationMode(UtilHttpAuth.AUTHENTICATIONMODE);
		int intAuthenticationMode=Integer.parseInt(AuthenticationMode);

		if (intAuthenticationMode==UtilHttpAuth.BASIC_AUTHEM)
		  {
		    if (basicAuth(res, baos) == false)
		    {
		      return;
		    }
		  }
		  else if (intAuthenticationMode ==UtilHttpAuth.DIGEST_AUTHEM)
		  {
		    if (digestAuth(res, baos, nc) == false)
		    {
		      return;
		    }
		  }
	}
    /**
     * 此方法用于basic认证校验
     * @param rsp
     * @param baos
     * @return
     */
    private boolean basicAuth(HttpServletResponse rsp,ByteArrayOutputStream baos)
    {
      //String httpKeyWord=baos.toString();
//      String httpKeyWord=baos.toString();
//      String basic= UtilHttpAuth.getBasicAuthInfo(httpKeyWord);
      String basic=UtilHttpAuth.getBasicAuthInfo("AuthorizationjavaabWVhY2hhbHlhbmc6bWVhY2hhbHlhbmc=dddddddddddddddddddddddffffffffffBasicfffffffffffffffff\r\nfffffffffffffffffffffffffffff");
      String  username=UtilHttpAuth.getAuthenticationMode(UtilHttpAuth.USER_USERNAME);
      String  password=UtilHttpAuth.getAuthenticationMode(UtilHttpAuth.PASSWORD);
      if(basic==null||basic.indexOf(UtilHttpAuth.getBASE64(username + ":" + password)) == -1)
      {
        sendBasicReq(rsp);
        return false;
      }
      return true;
    }
    
    private void sendBasicReq(HttpServletResponse rsp)
    {
      StringBuffer sb = new StringBuffer();
      ServletOutputStream sender = null;

      rsp.setStatus(401,"Authorization Required");
      sb.append("Basic realm=\"" +UtilHttpAuth.REALM + "\"");
      rsp.addHeader("WWW-Authenticate",sb.toString());
      
      try
      {
        sender = rsp.getOutputStream();
        sender.write("".getBytes());
        sender.flush();
      }
      catch(Exception e)
      {
        System.err.println(e);
      }
    }
    /**
     * digest认证方式
     * @param rsp
     * @param baos
     * @param nc
     * @return
     */
     private boolean digestAuth(HttpServletResponse rsp,ByteArrayOutputStream baos,int nc)
     {
       int index1 = 0,index2 = 0;
       String digest,temp;
       String username,realm,qop,nonce,ncValue,cnonce,response,uri;
       String MD5A1,MD5A2;
       
       
       /*检查序列化后的字符串是否包含Auth关键字*/
       String httpAuthKeyWord=baos.toString();
       
       digest=UtilHttpAuth.getDigestAuthInfo("AuthorizationjavaabWVhY2hhbHlhbmc6bWVhY2hhbHlhbmc=dddddddddusername=\"meachalyang\"realm=\"realm\"qop=\"auth\"uri=\"uri\"realm=\"realm\"fDigestfffffffffffffffff\r\nfffffffffffffffffffffffffffff");
       
  //     digest = UtilHttpAuth.getDigestAuthInfo(httpAuthKeyWord);
       if(digest==null){
    	   sendDigestReq(rsp);
           return false; 
       } 
       /*校验username*/
       username=UtilHttpAuth.getDigestParam(digest,UtilHttpAuth.USERNAME);
       String  conf_username=UtilHttpAuth.getAuthenticationMode(UtilHttpAuth.USER_USERNAME);
    
       if(username==null||!username.equals(conf_username))
       {
         sendDigestReq(rsp);
         return false;
       }
       
       realm = UtilHttpAuth.getDigestParam(digest, UtilHttpAuth.REALM);
       if(realm==null||!realm.equals(UtilHttpAuth.REALM)){
           sendDigestReq(rsp);
           return false;
       }
      
       /*校验qop*/
       qop=UtilHttpAuth.getDigestParam(digest, UtilHttpAuth.QOP);
       if(qop==null||!qop.equals("auth"))
       {
         sendDigestReq(rsp);
         return false;
       }

       /*取得uri*/
       uri=UtilHttpAuth.getDigestParam(digest, UtilHttpAuth.URI);
       if(uri==null){
    	   sendDigestReq(rsp);
           return false;
       }
       /*校验nonce*/
       nonce = UtilHttpAuth.getDigestParam(digest, UtilHttpAuth.NONCE);
       if(nonce==null||!nonce.equals(UtilHttpAuth.getBASE64("--NextPart_0_2817_24856")))
       {
         sendDigestReq(rsp);
         return false;
       }
       /*校验nc*/
       if((index1 = digest.indexOf("nc=")) == -1)
       {
         sendDigestReq(rsp);
         return false;
       }
       index1 = index1 + new String("nc").length()+1;
       if((index2 = digest.indexOf(",",index1)) == -1)
       {
         sendDigestReq(rsp);
         return false;
       }
       ncValue = digest.substring(index1,index2);
       if(Integer.parseInt(ncValue) != nc)
       {
         sendDigestReq(rsp);
         return false;
       }
       /*取得cnonce*/
       cnonce = UtilHttpAuth.getDigestParam(digest, UtilHttpAuth.CNONCE);
       if(cnonce==null){
    	   sendDigestReq(rsp);
           return false;
       }
       /*校验response*/
       response = UtilHttpAuth.getDigestParam(digest, UtilHttpAuth.RESPONSE).trim();
       if(response==null){
    	   sendDigestReq(rsp);
           return false;
       }
       String  password=UtilHttpAuth.getAuthenticationMode(UtilHttpAuth.PASSWORD);
       String  name=UtilHttpAuth.getAuthenticationMode(UtilHttpAuth.USER_USERNAME);
       MD5A1 = UtilHttpAuth.calcMD5(name+ ":" + UtilHttpAuth.REALM+ ":" + password);
       MD5A2 = UtilHttpAuth.calcMD5("POST" + ":" + uri);
       temp = UtilHttpAuth.calcMD5(MD5A1 + ":" + nonce + ":" + ncValue + ":" + cnonce + ":" + qop + ":" + MD5A2);
       if(!temp.trim().equals(response))
       {
         sendDigestReq(rsp);
         return false;
       }
       return true;
     }
测试数据:
  String digest=UtilHttpAuth.getDigestAuthInfo("AuthorizationjavaabWVhY2hhbHlhbmc6bWVhY2hhbHlhbmc=dddddddddusername=\"meachalyang\"realm=\"realm\"qop=\"auth\"uri=\"uri\"nonce=\"LS1OZXh0UGFydF8wXzI4MTdfMjQ4NTY=\"nc=1,cnonce=\"conce\"response=\"92dcf380bc94a077df83623d7e3e793e\"Digestfffffffffffffffff\r\nfffffffffffffffffffffffffffff");
  String basic=UtilHttpAuth.getBasicAuthInfo("AuthorizationjavaabWVhY2hhbHlhbmc6bWVhY2hhbHlhbmc=dddddddddddddddddddddddffffffffffBasicfffffffffffffffff\r\nfffffffffffffffffffffffffffff");
      
分享到:
评论

相关推荐

    基于Springcloud的基础框架,统一gateWay网关鉴权demo,附下载地址

    基于Springcloud的基础框架,统一gateWay网关鉴权demo,附下载地址 使用方法具体见:https://blog.csdn.net/a1139628523/article/details/132664763

    Udesk反馈标签鉴权Demo

    在这个“Udesk反馈标签鉴权Demo”中,我们主要关注的是如何在JavaWeb环境中实现Udesk工单SDK的用户签名算法,这是进行安全通信和验证客户端请求的重要环节。 首先,我们需要理解什么是鉴权。在Web开发中,鉴权通常...

    基于反射实现,高效 java版开放接口统一网关鉴权demo项目

    基于反射实现,高效 java版开放接口统一网关鉴权demo项目基于反射实现,高效 java版开放接口统一网关鉴权demo项目基于反射实现,高效 java版开放接口统一网关鉴权demo项目基于反射实现,高效 java版开放接口统一网关...

    .net6 基于jwt鉴权demo(最简单的demo)

    这个`.NET6 基于jwt鉴权demo`项目应该包含了一个简单的Web应用程序,展示了以上所有步骤。开发者可以通过运行项目,模拟登录过程,查看生成和验证JWT的实现细节。通过这种方式,开发者可以快速了解和实践在.NET 6...

    Java项目基于反射实现,高效 java版开放接口统一网关鉴权demo项目

    Java项目基于反射实现,高效 java版开放接口统一网关鉴权demo项目

    微信鉴权demo

    该demo资源结合了java和微信公众号鉴权,有助于开发微信公众号,获取用户信息等

    open-api-project:基于反射实现,高效 java版开放接口统一网关鉴权demo项目

    【标题】"基于反射实现,高效 Java版开放接口统一网关鉴权demo项目"揭示了这个开源项目的主要特性,即使用反射技术来提高性能,并且是针对Java开发者的开放接口鉴权解决方案。该项目旨在为Java开发者提供一个统一的...

    基于Springcloud的基础框架,统一gateWay网关鉴权demo

    通过以上这些知识点,我们可以构建一个健壮且安全的基于Spring Cloud Gateway的统一网关鉴权系统,确保只有经过身份验证和授权的请求才能访问后端微服务,从而提高系统的整体安全性。在实际开发中,还需要根据业务...

    onvif协议鉴权、云台控制demo,codeblock工程

    本项目提供的是一个使用gSOAP库实现的ONVIF协议鉴权与云台控制的代码示例。 gSOAP是开源的C/C++软件开发工具包,用于构建跨平台的Web服务客户端和服务器。它支持SOAP(Simple Object Access Protocol)和WSDL(Web ...

    Onvif编译及开发(带wsse鉴权和digest鉴权)

    gSOAP是一个开源C和C++库,用于生成客户端和服务端代码,以便在HTTP上实现SOAP和WSDL协议。在ONVIF开发中,gSOAP是关键组件,因为它可以处理复杂的SOAP消息交换,这些消息在ONVIF设备之间传输,如设备发现、能力查询...

    SpringBoot搭建的shiro鉴权的最简单的登录demo(绝对可用)

    直接把项目导入idea就能打开使用,该项目在简单实现shiro登录鉴权的基础上,还实现了接收数据的统一加工处理模块,在接收post或者get请求后,能返回固定模板格式的json数据给前端,对于初期的学习与应用很有帮助。...

    腾讯云鉴权+语音识别接口请求Demo

    腾讯云鉴权是访问腾讯云服务前的一个必要步骤,它确保只有经过验证的用户或应用程序才能访问云资源。鉴权过程通常涉及到API密钥的生成和使用。在本项目中,`authentication_key.py`文件很可能是用来存储和管理这些...

    spring security http接口鉴权使用示范项目

    Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,用于保护基于Java的应用程序。在本项目"spring security http接口鉴权使用示范项目"中,我们将深入探讨如何利用Spring Security来实现HTTP接口...

    springsecurity源码(鉴权有缺陷)

    虽然文件名中提到的是`dubbo demo`,这通常与分布式服务框架Dubbo有关,但在本场景下,可能是指一个使用Spring Security的示例应用。检查`dubbodemo`的源码,查找可能存在的鉴权问题,对配置进行审计,是防止安全...

    restful风格请求,token鉴权实例

    4. **自定义注解**:为了简化鉴权流程,我们可以创建一个自定义注解,比如`@AuthToken`。在控制器的方法上添加此注解,可以自动处理Token的验证,避免在每个方法中重复代码。 5. **错误处理**:如果Token无效或过期...

    rest api java demo(一个记账工程)

    (1)项目简介 这个demo很简单,是一个记账小工程...这个demo搭建了一个redis主从复制,具体可以参考:http://download.csdn.net/detail/zhutulang/9585010 数据库使用mysql,脚本在 src/main/resources/accounting.sql

    SpringBoot AOP各种注解、自定义注解、鉴权使用案例(免费下载)

    SpringBoot AOP,即面向切面编程,是Spring框架中的一个重要特性,用于实现代码的横切关注点,如日志记录、事务管理、权限验证等。AOP通过使用代理模式,将这些关注点与核心业务逻辑分离,使得代码更加模块化,更...

    微信js鉴权(微信自定义分享)demo

    微信 基于最新的微信JS-SDK说明文档 , 自定义分享实现,分享朋友,朋友圈,后台使用java做ticket定时刷新

Global site tag (gtag.js) - Google Analytics