Java 基于 IETF RFC 2617 身份认证

IETF RFC 2617 身份认证 是基于 HTTP 协议进行验证的,认证过程中需要发送两次 HTTP 请求,第一次请求服务器返回 401 和 认证标识(nonce),第二次访问HTTP请求头(Headers)中需要携带 Authorization 授权,具体值如下:

StringBuilder stringBuilder = new StringBuilder();
stringBuilder
        .append("Digest username=\"").append(userName)
        .append("\", realm=\"").append(realm)
        .append("\", nonce=\"").append(nonce)
        .append("\", uri=\"").append(digestURI)
        .append("\", algorithm=\"").append(algorithm)
        .append("\", qop=\"").append(qop)
        .append("\", nc=\"").append(nc)
        .append("\", cnonce=\"").append(cnonce)
        .append("\", response=\"").append(getResponse(userName,password)).append("\"");

其中

  • realm:领域
  • username:用户名
  • password:密码
  • digestURI:请求地址(请求地址中,ip端口之后的部分)
  • method:请求方式
  • nc:当前计数
  • cnonce:客户端计数
  • qop:保护质量
  • nonce:服务器计数(第一次访问返回401的请求头中携带)
  • response:参数校验(response 生成规则如下)

response 生成规则

a)HA1=MD5(A1)=MD5(username:realm:password)
b)HA2=MD5(A2)=MD5(method:digestURI)
c)response=MD5(HA1:nonce:nc:cnonce:qop:HA2)

/**
 * 生成 Authorization: response
 * @param userName
 * @param password
 * @return
 */
public static String getResponse(String userName,String password) {
    String A1 = userName +":"+realm+":"+ password;
    String A2 = "POST:"+ digestURI;
    String HA1 = MD5Util.string2MD5(A1);
    String HA2 = MD5Util.string2MD5(A2);
    String A3 = HA1 + ":" + nonce + ":"+nc+":"+cnonce+":"+qop+":" + HA2;
    String HA3 = MD5Util.string2MD5(A3).toLowerCase();
    return HA3;
}
postman 工具中有集成了 IETF RFC 2617 身份认证 可以用来测试在这里插入图片描述

附:MD5Util 工具类

import java.security.MessageDigest;

/**
 * 采用MD5加密解密
 *
 * @author tfq
 * @datetime 2011-10-13
 */
public class MD5Util {

    /*** 
     * MD5加码 生成32位md5码 
     */
    public static String string2MD5(String inStr) {
        MessageDigest md5 = null;
        try {
            //引用  java.security.MessageDigest公共类
            // getInstance("MD5")方法 设置加密格式
            md5 = MessageDigest.getInstance("MD5");  //此句是核心
        } catch (Exception e) {
            System.out.println(e.toString());
            e.printStackTrace();
            return "";
        }
        char[] charArray = inStr.toCharArray();
        byte[] byteArray = new byte[charArray.length];

        for (int i = 0; i < charArray.length; i++)
            byteArray[i] = (byte) charArray[i];
        byte[] md5Bytes = md5.digest(byteArray);
        StringBuffer hexValue = new StringBuffer();
        for (int i = 0; i < md5Bytes.length; i++) {
            int val = ((int) md5Bytes[i]) & 0xff;
            if (val < 16)
                hexValue.append("0");
            hexValue.append(Integer.toHexString(val));
        }
        return hexValue.toString();

    }

    /**
     * 加密解密算法[可逆] 执行一次加密,执行两次解密
     */
    public static String convertMD5(String inStr) {

        char[] a = inStr.toCharArray();
        for (int i = 0; i < a.length; i++) {
            a[i] = (char) (a[i] ^ 't');
        }
        String s = new String(a);
        return s;

    }

    // 测试主函数  
    public static void main(String args[]) {
        String s = new String("tangfuqiang");
        System.out.println("原始:" + s);
        System.out.println("MD5后:" + string2MD5(s));
        System.out.println("加密的:" + convertMD5(s));
        System.out.println("解密的:" + convertMD5(convertMD5(s)));

    }
}  
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值