import re import time import random import string import hashlib def digest(algo, text): if algo == "md5": hash = hashlib.md5() hash.update(text.encode("utf8")) return hash.hexdigest() elif algo == "sha256": hash = hashlib.sha256() hash.update(text.encode("utf8")) return hash.hexdigest() def splitUrl(url): p = re.compile("^(http://|https://)?([^/?]+)(/[^?]*)?(\\?.*)?$") if not p: return None m = p.match(url) if not m: return "", "", "", "" scheme, domain, uri, args = m.groups() if not scheme: scheme = "http://" if not uri: uri = "/" if not args: args = "" return scheme, domain, uri, args def getRandomString(n): x = ''.join(random.sample(string.ascii_letters + string.digits, n)) return x def genTypeAUrl(url, key, signName, uid, ts, algo): scheme, domain, uri, args = splitUrl(url) rand = getRandomString(10) text = "%s-%d-%s-%s-%s" %(uri, ts, rand, uid, key) hash = digest(algo, text) authArg = "%s=%d-%s-%s-%s" %(signName, ts, rand, uid, hash) if args: return "%s%s%s%s&%s" %(scheme, domain, uri, args, authArg) else: return "%s%s%s?%s" %(scheme, domain, uri, authArg) def genTypeBUrl(url, key, ts, algo): scheme, domain, uri, args = splitUrl(url) ts_str = time.strftime('%Y%m%d%H%M', time.localtime(ts)) text = "%s%s%s" % (key, ts_str, uri) hash = digest(algo, text) return "%s%s/%s/%s%s%s" %(scheme, domain, ts_str, hash, uri, args) def genTypeCUrl(url, key, ts, algo): scheme, domain, uri, args = splitUrl(url) ts = "%x" %(int(ts)) text = "%s%s%s" %(key, uri, ts) hash = digest(algo, text) return "%s%s/%s/%s%s%s" %(scheme, domain, hash, ts, uri, args) def genTypeDUrl(url, key, signName, tName, ts, ts_base, algo): scheme, domain, uri, args = splitUrl(url) ts_str = "%d" %(int(ts)) if ts_base == 16: ts_str = "%x" %(int(time.time())) text = "%s%s%s" %(key, uri, ts_str) hash = digest(algo, text) authArg = "%s=%s&%s=%s" %(signName, hash, tName, ts_str) if args: return "%s%s%s%s&%s" %(scheme, domain, uri, args, authArg) else: return "%s%s%s?%s" %(scheme, domain, uri, authArg) def genTypeEUrl(url, key, signName, timeName, ts, ts_base, algo): scheme, domain, uri, args = splitUrl(url) ts_str = "%d" %(int(ts)) if ts_base == 16: ts_str = "%x" %(int(time.time())) text = "%s%s%s%s" %(key, domain, uri, ts_str) hash = digest(algo, text) authArg = "%s=%s&%s=%s" %(signName, hash, timeName, ts_str) if args: return "%s%s%s%s&%s" %(scheme, domain, uri, args, authArg) else: return "%s%s%s?%s" %(scheme, domain, uri, authArg) def test(): url = 'http://www.test.com/a.txt?a=b&c=d' primaryKey = 'primary123456' signName = "sign" timeName = "t" uid = "0" ts = time.time() + 3600 # Assume requests expire in 1 hour. # ts = 1742289420 print("OriginUrl:{}".format(url)) for algo in ["md5", "sha256"]: print("TypeA + {}: {}".format(algo, genTypeAUrl(url, primaryKey, signName, uid, ts, algo))) print("TypeB + {}: {}".format(algo, genTypeBUrl(url, primaryKey, ts, algo))) print("TypeC + {}: {}".format(algo, genTypeCUrl(url, primaryKey, ts, algo))) print("TypeD + {}: {}".format(algo, genTypeDUrl(url, primaryKey, signName, timeName, ts, 10, algo))) print("TypeE + {}: {}".format(algo, genTypeEUrl(url, primaryKey, signName, timeName, ts, 10, algo))) if __name__ == "__main__": test()