package com.inspect.tcpserver.sip.utils; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Formatter; public class DigestUtil { /** * 计算Digest响应值 * @param username 用户名 * @param password 密码 * @param realm 域 * @param nonce 随机数 * @param method SIP请求方法,如REGISTER * @param uri 请求URI * @param nc 请求计数(可以传null或"00000001"初始值) * @param cnonce 客户端随机串(可传null) * @param qop 质量保护参数(可传null) * @return response摘要字符串 */ public static String computeResponse(String username, String password, String realm, String nonce, String method, String uri, String nc, String cnonce, String qop) { try { String ha1 = md5Hex(username + ":" + realm + ":" + password); String ha2 = md5Hex(method + ":" + uri); String response; if (qop != null && (qop.equals("auth") || qop.equals("auth-int"))) { response = md5Hex(ha1 + ":" + nonce + ":" + nc + ":" + cnonce + ":" + qop + ":" + ha2); } else { response = md5Hex(ha1 + ":" + nonce + ":" + ha2); } return response; } catch (Exception e) { throw new RuntimeException("Failed to compute digest response", e); } } /** * MD5加密,返回16进制字符串 */ private static String md5Hex(String data) throws NoSuchAlgorithmException { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] digest = md.digest(data.getBytes(StandardCharsets.UTF_8)); return byteArrayToHexString(digest); } /** * 将字节数组转为16进制字符串 */ private static String byteArrayToHexString(byte[] bytes) { Formatter formatter = new Formatter(); for (byte b : bytes) { formatter.format("%02x", b); } String res = formatter.toString(); formatter.close(); return res; } }