您的位置:首页 > 编程语言 > C#

七牛时间戳防盗链生成csharp,c#实现

2016-06-03 16:50 1026 查看
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace timetoken
{
class Program
{
static void Main(string[] args)
{
sign_help();
Console.WriteLine("等待输入type");
string type = Console.ReadLine().ToString();
Console.WriteLine("等待输入key");
string key = Console.ReadLine().ToString();
Console.WriteLine("等待输入t");
UInt64 t = UInt64.Parse(Console.ReadLine().ToString());
Console.WriteLine("等待输入url");
string url = Console.ReadLine().ToString();
test(type,key,url,t);
Console.ReadKey();
}

public static UInt64 to_deadline(UInt64 rang)
{
Console.WriteLine("to_deadline----UniversalTime" + ((UInt64)(DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000 + (UInt64)rang));
return (UInt64)(DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000 + (UInt64)rang;
}
public static string t16(UInt64 t)
{
return t.ToString("x").ToLower();
}
public static string sign(string key, string t, string path)
{
string sign_s = summd5(key, t, path);
Console.WriteLine("sign----sign_s" + sign_s);
string sign_part = "sign=" + sign_s + "&t=" + t;
Console.WriteLine("sign----sign_part" + sign_part);
return sign_part;
}
public static string summd5(string key, string t, string path)
{
MD5 md5Hash = MD5.Create();
//获取时间戳签名的byte类型数组
byte[] time_token = Encoding.UTF8.GetBytes(key + path + t);
Console.WriteLine("summd5----time_token" + key + path + t);
byte[] byteMd5UserPwd = md5Hash.ComputeHash(time_token);
//将byte类型的Md5值转换为字符串
StringBuilder sBuilder = new StringBuilder();

// Loop through each byte of the hashed data
// and format each one as a hexadecimal string.
for (int i = 0; i < byteMd5UserPwd.Length; i++)
{
sBuilder.Append(byteMd5UserPwd[i].ToString("x2"));
}
;
Console.WriteLine("summd5----strMd5Pwd" + sBuilder.ToString());
//返回时间戳签名
return sBuilder.ToString();
}

public static string sign_url(string key, string t, string p_url)
{
byte[] b = System.Text.Encoding.UTF8.GetBytes(p_url);
p_url=System.Text.Encoding.UTF8.GetString(b);
Console.WriteLine("sign_url----p_url" + p_url);
Uri url = new Uri(p_url);
Console.WriteLine("sign_url----url.LocalPath" + url.LocalPath);
string sign_part = sign(key, t, url.LocalPath);
Console.WriteLine("sign_url----sign_part" + sign_part);
string query_part;
if (url.Query !=""){
Console.WriteLine("sign_url----url.Query" + url.Query);
query_part = url.Query + "&" + sign_part;
}
else {
query_part = "?" + sign_part;
}
Console.WriteLine("sign_url----query_part" + query_part);
return url.Scheme + "://" + url.Host + url.LocalPath + query_part;
}
public static void sign_help()
{
Console.WriteLine("time <key> <url> <t>\n");
Console.WriteLine("deadline <key> <url> <deadline>\n");
Console.WriteLine("check <key> <signed_url>\n");
}
public static string sign_time(string key, string url, UInt64 rang)
{
UInt64 deadline = to_deadline(rang);
Console.WriteLine("sign_time----deadline" + deadline);
return  sign_deadline(key, url, deadline);
}
public static string sign_deadline(string key, string url, UInt64 deadline)
{
string t = t16(deadline);
Console.WriteLine("sign_deadline----t" + t);
return sign_url(key,t,url);
}
public static bool sign_check(string key,string signed_url) {

byte[] b = System.Text.Encoding.UTF8.GetBytes(signed_url);
signed_url = System.Text.Encoding.UTF8.GetString(b);
Uri url = new Uri(signed_url);
string sign_s = summd5(key, subs(url.Query,"t="),url.LocalPath );
Console.WriteLine("sign_check----sign_s" + sign_s);
Console.WriteLine("sign_check----subs(url.Query,‘t’)" + subs(url.Query,"t="));
Console.WriteLine("sign_check----subs(url.Query, 'sign')" + subs(url.Query, "sign="));
return (sign_s + "&t="+subs(url.Query, "t=") == subs(url.Query, "sign="));

}
public static string subs(string s, string start)
{

int i = s.IndexOf(start) + start.Length ;
int j = s.Length;
return  s.Substring(i, j - i);
}
public static void test(string type, string key, string url, UInt64 t)
{
if (type == "time")
{
Console.WriteLine( sign_time(key,url,t));
}
if (type == "deadline")
{
Console.WriteLine( sign_deadline(key,url,t));
}
if (type == "check")
{
Console.WriteLine(sign_check(key,url));
}
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: