摘要认证 java_摘要认证及实现HTTP digest authentication

本文介绍了如何在Java中实现HTTP摘要认证,包括服务器生成随机数nonce、客户端响应并计算摘要、服务器验证的过程。通过摘要认证,密码以摘要形式传输,防止明文密码泄露,并使用随机数nonce来防御重放攻击。详细讨论了MD5计算摘要的方法以及服务器验证客户端摘要的逻辑。
摘要由CSDN通过智能技术生成

最近工作需要做了摘要认证(digest authentication),下面就工作中遇到的问题及过程做一个总结。

第一次客户端请求

GET/POST

服务器产生一个随机数nonce,服务器将这个随机数放在WWW-Authenticate响应头,与服务器支持的认证算法列表,认证的域realm一起发送给客户端,如下例子:

HTTP /1.1 401 Unauthorized

WWW-Authenticate:Digest

realm= ”test realm”

qop=auth,auth-int”

nonce=”66C4EF58DA7CB956BD04233FBB64E0A4”

opaque="5ccc069c403ebaf9f0171e9517f40e41"

• realm的值是一个简单的字符串

• qop是认证的(校验)方式

• nonce是随机数, 可以用GUID

• opaque是个随机字符串,它只是透传而已,即客户端还会原样返回过来。

• algorithm 是个字符串,用来指示用来产生分类及校验和的算法对。如果该域没指定,则认为是“MD5“算法。

客户端发现是401响应,表示需要进行认证,则弹出让用户输入用户名和密码的认证窗口,客户端选择一个算法,计算出密码和其他数据的摘要(response),将摘要放到Authorization的请求头中发送给服务器,如果客户端要对服务器也进行认证,这个时候,可以发送客户端随机数cnonce。如下例子:

GET/cgi-bin/checkout?a=b H

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中进行摘要认证Digest Authentication),可以使用JavaHttpURLConnection类来发送HTTP请求。以下是一个使用HttpURLConnection发送带有Digest认证的GET请求的示例代码: ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class DigestAuthExample { public static void main(String[] args) throws Exception { String url = "http://IP地址/ISAPI/Streaming/channels/1/picture"; String username = "admin"; String password = "12345"; HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); connection.setRequestMethod("GET"); // 添加Digest认证头部 String authHeader = getDigestAuthHeader(connection, username, password); connection.setRequestProperty("Authorization", authHeader); // 发送请求 int responseCode = connection.getResponseCode(); System.out.println("Response Code: " + responseCode); // 读取响应内容 BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String inputLine; StringBuilder response = new StringBuilder(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); System.out.println("Response Content: " + response.toString()); } private static String getDigestAuthHeader(HttpURLConnection connection, String username, String password) throws IOException { String realm = null; String nonce = null; String qop = null; String cnonce = null; String nc = null; // 发送第一次请求,获取服务器返回的Digest认证参数 int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_UNAUTHORIZED) { String authHeader = connection.getHeaderField("WWW-Authenticate"); String[] authParams = authHeader.split(",\\s*"); // 解析Digest认证参数 for (String authParam : authParams) { String[] keyValue = authParam.split("=", 2); String key = keyValue[0].trim(); String value = keyValue[1].trim().replaceAll("\"", ""); if (key.equalsIgnoreCase("realm")) { realm = value; } else if (key.equalsIgnoreCase("nonce")) { nonce = value; } else if (key.equalsIgnoreCase("qop")) { qop = value; } } // 计算响应摘要 String ha1 = DigestUtils.md5Hex(username + ":" + realm + ":" + password); String ha2 = DigestUtils.md5Hex("GET" + ":" + "/ISAPI/Streaming/channels/1/picture"); nc = "00000001"; cnonce = DigestUtils.md5Hex(String.valueOf(System.nanoTime())); String response = DigestUtils.md5Hex(ha1 + ":" + nonce + ":" + nc + ":" + cnonce + ":" + qop + ":" + ha2); // 构造Digest认证头部 StringBuilder authBuilder = new StringBuilder("Digest "); authBuilder.append("username=\"" + username + "\", "); authBuilder.append("realm=\"" + realm + "\", "); authBuilder.append("nonce=\"" + nonce + "\", "); authBuilder.append("uri=\"" + "/ISAPI/Streaming/channels/1/picture" + "\", "); authBuilder.append("qop=" + qop + ", "); authBuilder.append("nc=" + nc + ", "); authBuilder.append("cnonce=\"" + cnonce + "\", "); authBuilder.append("response=\"" + response + "\""); return authBuilder.toString(); } return null; } } ``` 注意,以上代码中使用了Apache Commons Codec库的`DigestUtils.md5Hex()`方法进行MD5摘要计算,需要先导入该库。建议使用最新版本的库。 另外,由于海康威视的视频监控设备的接口通常需要使用HTTP Basic或Digest认证才能访问,因此在进行接口调用时需要先获取到正确的认证参数,并在HTTP头部添加相应的认证信息。具体的认证方式和参数可以参考海康威视设备的开发文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值