UTV验证


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

#!/usr/bin/env python3

# coding: utf-8

import sys

import traceback

import argparse

import time

import hashlib

import hmac

import base64

import re

import pyDes

from urllib.parse import urlparse, parse_qsl, urlencode, unquote_plus

parser = argparse.ArgumentParser()

parser.add_argument("--method", choices = ["md5", "hmac", "3des", "de3des"], default = "md5", help = "Method for UTV")

parser.add_argument("--url", required = True, help = "The URL which needs to apply UTV")

parser.add_argument("--secret", required = True, help = "The encrypt key for UTV")

parser.add_argument("--hex", action = "store_true", default = False, help = "Time in HEX format")

parser.add_argument("--expire", metavar = "seconds", type = int, default = 0, help = "Expire seconds add to time allow")

parser.add_argument("--basetime", metavar = "UNIX_time_seconds", type = float, default = time.time(), help = "Base time (For development confirm)")

parser.add_argument("--miaopai", action = "store_true", default = False, help = "Generate UTV for Miaopai")

parser.add_argument("--secret_3des", help = "The encrypt key for 3DES hash")

def get_md5_url(base_url, secret, base_time, hex, expire, miaopai = False):

    url_parts = urlparse(base_url)

    url_host = url_parts.netloc

    url_path = url_parts.path

    url_query = url_parts.query

    if miaopai:

        expire = base_time * 1000 + expire * 1000

        expire = int(expire)

    else:

        expire = base_time + expire

        expire = int(expire)

    if hex:

        expire = str(format(expire, ‘x‘))

    else:

        expire = str(expire)

    if miaopai:

        match = re.match(r‘^/stream/(.*)\.(.*)($|\?.*)‘, url_path)

        if match:

            url_data = match.group(1)

            print(url_data)

        str_byte = (url_data + secret + expire).encode(‘utf-8‘)

    else:

        str_byte = (secret + url_path + expire).encode(‘utf-8‘)

    m = hashlib.md5()

    m.update(str_byte)

    hmac = m.hexdigest()

    url_query_params = parse_qsl(url_query, keep_blank_values = True)

    if miaopai:

        url_query_params.append((‘time_stamp‘, expire))

        url_query_params.append((‘ssig‘, hmac))

    else:

        url_query_params.append((‘px-time‘, expire))

        url_query_params.append((‘px-hash‘, hmac))

    url_query_param = urlencode(url_query_params)

    re_url = url_parts.scheme + "://" + url_host + url_path + "?" + url_query_param

    re_url = re_url.replace(‘=&‘, ‘&‘)

    re_url = re.sub(r‘=$‘, ‘‘, re_url)

    return re_url

def get_hmac_url(base_url, secret, base_time, expire):

    url_parts = urlparse(base_url)

    url_host = url_parts.netloc

    url_path = url_parts.path

    url_query = url_parts.query

    expire = base_time + expire

    str_sign = (‘GET‘ + ‘\n‘ + ‘\n‘ + ‘\n‘ + str(expire) + ‘\n‘ + ‘/‘ + url_host + url_path).encode(‘utf-8‘)

    str_ssig = base64.b64encode(hmac.new(bytearray(secret, ‘utf-8‘), str_sign, hashlib.sha1).digest())[5:15]

    url_query_params = parse_qsl(url_query, keep_blank_values = True)

    url_query_params.append((‘ssig‘, str_ssig))

    url_query_params.append((‘Expires‘, expire))

    url_query_param = urlencode(url_query_params)

    return url_parts.scheme + ‘://‘ + url_host + url_path + ‘?‘ + url_query_param

def get_3des_url(base_url, secret_3des, secret, base_time, hex, expire):

    url_parts = urlparse(base_url)

    url_host = url_parts.netloc

    url_path = url_parts.path

    url_query = url_parts.query

    calc_path = url_path[1:]

    calc_byte = calc_path.encode(‘utf-8‘)

    secret_byte = bytearray(secret_3des, ‘utf-8‘)

    secret_byte_24 = bytearray(‘‘, ‘utf-8‘)

    if len(secret_byte) < 24:

        for x in range(0, 24 - len(secret_byte)):

            secret_byte.append(0b0)

    elif len(secret_byte) > 24:

        x = 0

        while(x < 24):

            secret_byte_24.append(secret_byte[x])

            x += 1

        secret_byte = secret_byte_24

    k = pyDes.triple_des(secret_byte, pyDes.ECB, b"\0\0\0\0\0\0\0\0", pad = None, padmode = pyDes.PAD_PKCS5)

    d = k.encrypt(calc_byte)

    url_query_params = parse_qsl(url_query, keep_blank_values = True)

    url_query_params.append((‘encrypt‘, str(1)))

    url_query_param = urlencode(url_query_params)

    url_path = unquote_plus(str(base64.b64encode(d)), encoding=‘utf-8‘).replace(‘ ‘, ‘-‘)[2:-1]

    des3_url = url_parts.scheme + ‘://‘ + url_host + ‘/‘ + url_path + ‘?‘ + url_query_param

    return(get_md5_url(des3_url, secret, base_time, hex, expire))

def decode_3des_url(base_url, secret_3des):

    url_parts = urlparse(base_url)

    url_host = url_parts.netloc

    url_path = url_parts.path

    url_query = url_parts.query

    de_url_path = url_path.replace(‘-‘, ‘+‘)

    de_url_path = base64.b64decode(de_url_path[1:].encode(‘utf-8‘))

    secret_byte = bytearray(secret_3des, ‘utf-8‘)

    secret_byte_24 = bytearray(‘‘, ‘utf-8‘)

    if len(secret_byte) < 24:

        for x in range(0, 24 - len(secret_byte)):

            secret_byte.append(0b0)

    elif len(secret_byte) > 24:

        x = 0

        while(x < 24):

            secret_byte_24.append(secret_byte[x])

            x += 1

        secret_byte = secret_byte_24

    k = pyDes.triple_des(secret_byte, pyDes.ECB, b"\0\0\0\0\0\0\0\0", pad = None, padmode = pyDes.PAD_PKCS5)

    d = k.decrypt(de_url_path)

    url_path = str(d)[2:-1]

    return url_parts.scheme + ‘://‘ + url_host + ‘/‘ + url_path

def main():

    args = parser.parse_args()

    utv_method = args.method

    utv_url = args.url

    utv_secret = args.secret

    utv_hex = args.hex

    utv_expire = args.expire

    utv_basetime = args.basetime

    utv_miaopai = args.miaopai

    utv_secret_3des = args.secret_3des

    if utv_method == "md5":

        print(get_md5_url(utv_url, utv_secret, utv_basetime, utv_hex, utv_expire, utv_miaopai))

    elif utv_method == "hmac":

        print(get_hmac_url(utv_url, utv_secret, utv_basetime, utv_expire))

    elif utv_method == "3des":

        print(get_3des_url(utv_url, utv_secret_3des, utv_secret, utv_basetime, utv_hex, utv_expire))

    elif utv_method == "de3des":

        print(decode_3des_url(utv_url, utv_secret))

    exit()

if __name__ == ‘__main__‘:

    main()

时间: 2024-10-13 22:31:12

UTV验证的相关文章

ASP.NET MVC 使用Remote特性实现远程属性验证

RemoteAttribute是asp.net mvc 的一个验证特性,它位于System.Web.Mvc命名空间 下面通过例子来说明 很多系统中都有会员这个功能,会员在前台注册时,用户名不能与现有的用户名重复,还要求输入手机号码去注册,同时手机号码也需要验证是否重复,下面是实体类 /// <summary> /// 会员 /// </summary> public class Member { public int Id { get; set; } [Required(Error

IE 弹出提示:由于无法验证发布者,所以Windows 已经阻止此软件

由于无法验证发布者,所以Windows 已经阻止此软件 按如下步骤:1.打开Internet Explorer---菜单栏点“工具”---Internet选项--安全---自定义级别---安全设置---“ActiveX控件和插件下”的第5个“下载未签名的ActiveX控件”选择“提示”---确定!刷新您要安装的页面即可(因为使用的软件没有通过微软的徽标认证,在SP2中默认是不允许安装这样的程序的,解决方法为开始-控制面板-系统-硬件.其中在驱动程序项里有有个“驱动程序签名”的选项,点开后.选第一

Oracle基础学习2--Oracle登录与三种验证机制

首先,Oracle安装完毕有三个默认用户 ?  Sys:数据库对象的拥有者.权限最高.password在安装的时候(口令管理)能够改变 ?  System:数据库管理员,password为manager ?  Scott:一个普通用户,password为tiger 再看连接Oracle的三种验证机制 ?  操作系统验证(具体解释见以下) ?  password文件验证 ?  数据库验证 注:前两者适用于系统用户,比方:Sys.System等:最后一个适用于普通用户.比方:Scott. 再看Ora

SpringMVC中文件上传的客户端验证

SpringMVC中文件上传的客户端验证 客户端验证主要思想:在jsp页面中利用javascript进行对文件的判断,完成验证后允许上传 验证步骤:1.文件名称 2.获取文件的后缀名称 3.判断哪些文件类型允许上传 4.判断文件大小 5.满足条件后跳转后台实现上传 前台界面(验证上传文件是否格式满足要求): <body> <h2>文件上传</h2> <form action="upload01" method="post" 

PHP.48-TP框架商城应用实例-后台23-权限管理-权限验证

权限验证 1.登录控制器 2.通过tp验证码类生成验证码图片 3.在管理员模型增加登录验证规则 4.后台中所有的控制器必须先登录才能访问 思路:在访问任何一个控制器之前都判断一个session即可,=>增加一个父控制器验证Session 让所有后台的控制器[除了Login控制器之外的]都继承自这个控制器 5.在管理员访问后台的任何一个页面之前先到数据库中查看当前管理员所在的角色是否有权限访问这个页面 在权限模型中增加此检查方法,在父类登录控制器中调用 6.后台左侧只显示当前管理员有权限访问的按钮

在Laravel中使用Middleware进行身份验证

新建一个中间件: 方法写在handle中 判断用户是否登录而且是否是管理员,不是的话返回到主页 新建判断是否为管理员的方法 在kernel定义一个中间件,key是admin 注册群组路由:prefix是路由前缀,访问路由会自动在前面加上路由前缀:middleware是key值,会去验证中间件 1在数据库中是管理员 成功 附: 注册单个路由的中间件: Route::get('admin/profile', ['middleware' => 'auth', function () { // }]);

利用SHELL脚本来验证Oracle数据库RMAN备份集的有效性

利用SHELL脚本来验证Oracle数据库RMAN备份集的有效性 作者:赵全文  网名:guestart 我们生产环境的Oracle数据库都做了RMAN备份,是采用了一周的RMAN备份保留策略:除了使用RMAN备份以外,我们还使用了爱数(Eisoo)备份软件来进行备份,可以说是做到了有备无患.可是,如果有一天,Oracle数据库由于主机层面硬件原因或是数据库层面的原因不能对外提供高可用服务的时候,假设数据丢了一大部分,我们只有用RMAN备份来进行恢复,再如果发现,RMAN备份失效了,那就往地缝里

为MongoDB添加身份验证

MongoDB 默认没有开户身份验证,除非不开放外网访问,否则这种模式极不安全,现纪录添加身份验证步骤如下: 配置创建用户的时候,需要关闭: #security:##副本集之间通信用到的认证文件# keyFile: /home/soft/mongodb-linux-x86_64-rhel62-3.4.2-shard2/mongo-key# clusterAuthMode: "keyFile"##开启身份验证# authorization: "enabled" 因为你

WebApi基于Token和签名的验证

最近一段时间在学习WebApi,涉及到验证部分的一些知识觉得自己并不是太懂,所以来博客园看了几篇博文,发现一篇讲的特别好的,读了几遍茅塞顿开(都闪开,我要装逼了),刚开始读有些地方不理解,所以想了很久,因此对原文中省略的部分这里做一点个人的理解和补充,非常基础,知道的园友就不需要了,只是帮助初次学习的园友理解.原文传送门: http://www.cnblogs.com/MR-YY/p/5972380.html#!comments 本篇博文中的所有代码均来自上述链接,如果你觉得有帮助,请点击链接给