import java.math.BigInteger; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.text.SimpleDateFormat; import java.util.regex.*; import java.util.*; public class UrlAuth { private static String getHashString(String algorithm, String text) { MessageDigest hash = null; try { hash = MessageDigest.getInstance(algorithm); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } hash.update(StandardCharsets.UTF_8.encode(text)); return String.format("%x", new BigInteger(1, hash.digest())); } private static String getRandomString(int length) { int leftLimit = 48; // numeral '0' int rightLimit = 122; // letter 'z' Random random = new Random(); String str = random.ints(leftLimit, rightLimit + 1) .filter(i -> (i <= 57 || i >= 65) && (i <= 90 || i >= 97)) .limit(length) .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) .toString(); return str; } private static Map splitUrl(String url) { String pattern = "^(http://|https://)?([^/?]+)(/[^?]*)?(\\?.*)?$"; Pattern r = Pattern.compile(pattern); Matcher m = r.matcher(url); Map result = new HashMap<>(); String scheme = "", domain = "", uri = "", args = ""; if (m.find()) { scheme = m.group(1) == null ? "http://" : m.group(1); domain = m.group(2) == null ? "" : m.group(2); uri = m.group(3) == null ? "/" : m.group(3); args = m.group(4) == null ? "" : m.group(4); } result.put("scheme", scheme); result.put("domain", domain); result.put("uri", uri); result.put("args", args); return result; } private static String genUrl(String url, String key, long ts) { Map uriInfo = splitUrl(url); String scheme = uriInfo.get("scheme"), domain = uriInfo.get("domain"), uri = uriInfo.get("uri"), args = uriInfo.get("args"); String rand = getRandomString(10); String text = String.format("%s-%d-%s-%s", uri, ts, rand, key); String hash = getHashString("MD5", text); String authArg = String.format("auth_key=%d-%s-%s", ts, rand, hash); if (Objects.equals(args, "")) return String.format("%s%s%s?%s", scheme, domain, uri, authArg); else return String.format("%s%s%s%s&%s", scheme, domain, uri, args, authArg); } public static void main(String[] args) { String url = "http://www.test.com/a.txt?a=b&c=d"; String secretKey = "secretKey"; long ts = System.currentTimeMillis() / 1000; System.out.println("OriginUrl: " + url); System.out.printf("AuthUrl: %s\n", genUrl(url, secretKey, ts)); } }