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

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));
            }
        }

    }
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值