腾讯云COS请求签名C#版

网上没有找到C#版 的签名代码,只好去一字一字的读SDK文档,自己写了一个,没有在CSDN搞什么积分下载,写的不好勿喷,能用点个赞再走.

空参和空的请求头是通过了与官方网的验证了,没有问题,可以直接下载COS中的文件.如果要带参,带头就自己试一下,如有有错告诉我一下再走.

文件名没有做过中文名的,我没有打算存中文的文件名,所以没有字符串特殊处理,用最简单的方式达到目的.

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Linq;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Web;

/// <summary>
/// CosSignature 的摘要说明  生成腾讯云COS签名类
/// ======作者:rovedog
/// ======日期:2020.2.24
/// </summary>
public class CosSignature
{

    /// <summary>
    /// 密码ID
    /// </summary>
    public string SecretId { get; set; }

    /// <summary>
    /// 密码内容
    /// </summary>
    public string SecretKey { get; set; }

    /// <summary>
    /// 开始时间
    /// </summary>
    public DateTime StartTimestamp { get; set; } = DateTime.Now;

    /// <summary>
    /// 签名有效期,单位秒,默认10分钟
    /// </summary>
    public int ExpiredTime { get; set; } = 600;

    /// <summary>
    /// 请求参数
    /// </summary>
    public NameValueCollection NVC;

    /// <summary>
    /// 请求头
    /// </summary>
    public WebHeaderCollection   RequestHeader;

    /// <summary>
    /// 请求方法
    /// </summary>
    public string HttpMethod { get; set; } = "get";

    /// <summary>
    /// 请求的url
    /// 若需验证url参数则填写,key小写,value需要进行URLEncode,多个key以字典排序,如:max-keys=20&amp;prefix=abc
    /// </summary>
    ///<example>签名中的请求路径以 / 开头,无需URLEncode,如:/ 、 /a/b 或 /测试.jpg</example>
    public string HttpURI { get; set; }

    /// <summary>
    /// 实例初始化对象
    /// </summary>
    /// <param name="secretId"></param>
    /// <param name="secretKey"></param>
    /// <param name="HttpUri"></param>
    public CosSignature(string secretId, string secretKey, string HttpUri = "/")
    {
        HttpURI = HttpUri;
        SecretId = secretId;
        SecretKey = secretKey;
    }

    /// <summary>
    /// 创建一个签名
    /// </summary>
    /// <returns></returns>
    public Return Create()
    {
        Return R = new Return();
        HttpMethod = HttpMethod.ToLower();
        List<string> M = new List<string> {"get", "post", "put", "delete", "head"};
        if (M.IndexOf(HttpMethod) == -1)
        {
            R.BOOL = false;
            R.Error = "未知请求方法!";
            return R;
        }

        if (string.IsNullOrEmpty(SecretId))
        {
            R.BOOL = false;
            R.Error = "密码ID为空!";
            return R;
        }

        if (string.IsNullOrEmpty(SecretKey))
        {
            R.BOOL = false;
            R.Error = "密码内容为空!";
            return R;
        }
        if (StartTimestamp > DateTime.Now) StartTimestamp = DateTime.Now;
        //步骤1:生成 KeyTime
        long startTimestamp = (StartTimestamp.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
        long endTimestamp = startTimestamp + ExpiredTime;
        string keyTime = string.Format("{0};{1}", startTimestamp, endTimestamp);
        //步骤2:生成 SignKey
        string SignKey = HMACSHA1(SecretKey, keyTime);
        //步骤3:生成 UrlParamList 和 HttpParameters
        List<string> Key = new List<string>();
        List<string> KeyValue = new List<string>();
        Dictionary<string, string> Param = new Dictionary<string, string>();
        if (NVC != null)
        {
            foreach (var k in NVC.Keys)
            {
                string kk = HttpUtility.UrlEncode(k.ToString()).ToLower();
                Param.Add(kk, HttpUtility.UrlEncode(NVC[k.ToString()]));
                Key.Add(kk);
            }

            Key.Sort();
            foreach (var k in Key)
            {
                KeyValue.Add(string.Format("{0}={1}", k, Param[k]));
            }
        }
        string HttpParameters = NVC != null ? string.Join("&", KeyValue.ToArray()) : "";
        string UrlParamList = NVC != null ? string.Join(";", Key) : "";
        //步骤4:生成 HeaderList 和 HttpHeaders
        Key.Clear();
        Dictionary<string, string> Hearder = new Dictionary<string, string>();
        if (RequestHeader != null)
        {
            foreach (var k in RequestHeader.AllKeys)
            {
                string kk = HttpUtility.UrlEncode(k).ToLower();
                Hearder.Add(kk, HttpUtility.UrlEncode(RequestHeader[k]));
                Key.Add(kk);
            }

            Key.Sort();
            KeyValue.Clear();
            foreach (var k in Key)
            {
                KeyValue.Add(string.Format("{0}={1}", k, Hearder[k]));
            }
        }
        string HttpHeaders = RequestHeader != null ? string.Join("&", KeyValue.ToArray()) : "";
        string HeaderList = RequestHeader != null ? string.Join(";", Key) : "";
        //步骤5:生成 HttpString
        string HttpString = string.Format("{0}\n{1}\n{2}\n{3}\n", HttpMethod, HttpURI, HttpParameters, HttpHeaders);
        //步骤6:生成 StringToSign
        string StringToSign = string.Format("sha1\n{0}\n{1}\n", keyTime, SHA1(HttpString));
        //步骤7:生成 Signature
        string Signature = HMACSHA1(SignKey, StringToSign);
        //步骤8:生成签名
        R.STRING = string.Format("q-sign-algorithm=sha1&q-ak={0}&q-sign-time={1}&q-key-time={1}&q-header-list={2}&q-url-param-list={3}&q-signature={4}", SecretId, keyTime, HeaderList, UrlParamList, Signature);
        //List<string> o = new List<string> {string.Format("SignKey={0}", SignKey), string.Format("HttpString={0}", HttpString), string.Format("StringToSign={0}", StringToSign)};
        //R.OBJECT = string.Join("<br/>", o);
        return R;
    }

    /// <summary>
    /// HMACSHA1加密方法
    /// </summary>
    /// <param name="content"></param>
    /// <param name="secretKey"></param>
    /// <returns></returns>
    public static string HMACSHA1(string secretKey, string content)
    {
        byte[] keyByte = Encoding.Default.GetBytes(secretKey);
        HMACSHA1 hmacsha1 = new HMACSHA1(keyByte);
        byte[] messageBytes = Encoding.Default.GetBytes(content);
        byte[] hashmessage = hmacsha1.ComputeHash(messageBytes);
        StringBuilder sb = new StringBuilder("");
        foreach (byte b in hashmessage)
        {
            sb.AppendFormat("{0:x2}", b);
        }
        return sb.ToString();
    }

    /// <summary>
    /// SHA1加密方法
    /// </summary>
    /// <param name="content"></param>
    /// <returns></returns>
    public static string SHA1(string content)
    {
        var sha1 = new SHA1CryptoServiceProvider();
        byte[] c = Encoding.Default.GetBytes(content);
        byte[] sc = sha1.ComputeHash(c);
        StringBuilder sb = new StringBuilder("");
        foreach (byte b in sc)
        {
            sb.AppendFormat("{0:x2}", b);
        }
        return sb.ToString();
    }
}

其中Return是自创了一个神奇的返回类型,想怎么返回就怎么返回,适用于不太讲究性能和并发的应用,希望大佬指点迷津,不用的话改成自己的字符返回类型,

/// <summary>
/// 需要多个返值的值类型 2019.4.10
/// </summary>
[Serializable]
public class Return
{
    public Return()
    {
        BOOL = true;
        INT = 0;
        STRING = "";
        Error = "";
        Information = "";
        ExcuteTime = 0;
    }

    /// <summary>
    /// 布尔型返回结果,默认是true
    /// </summary>
    public bool BOOL { get; set; }

    /// <summary>
    /// 整型返回结果
    /// </summary>
    public int INT { get; set; }

    /// <summary>
    /// 字符串类型结果返回
    /// </summary>
    public string STRING { get; set; }

    /// <summary>
    /// 可序列化的object类型返回结果
    /// </summary>
    public object OBJECT { get; set; }
    /// <summary>
    /// 执行的相关信息
    /// </summary>
    public string Information { get; set; }

    /// <summary>
    /// 错误消息
    /// </summary>
    public string Error { get; set; }
    /// <summary>
    /// 执行时间
    /// </summary>
    public long ExcuteTime { get; set; }
}

原文地址:https://www.cnblogs.com/rovedog/p/12355483.html

时间: 2024-08-29 12:39:42

腾讯云COS请求签名C#版的相关文章

微信小程序/网站 上传图片到腾讯云COS

COS简介: 腾讯云提供的一种对象存储服务,供开发者存储海量文件的分布式存储服务.可以将自己开发的应用的存储部分全部接入COS的存储桶中,有效减少应用服务器的带宽,请求等.个人也可以通过腾讯云账号免费使用COS6个月,https://cloud.tencent.com/product/cos 整体流程简介:  1. 前端引入cos的SDK文件 2. 监听上传控件,并在图片加载至网页临时流中发起签名请求 3.后端根据上传的请求方式和路径参数返回签名Authorization和token XCosS

阿里云OSS和腾讯云COS互相迁移

利用阿里.腾讯的帮助文档中提供的迁移工具测试迁移对象存储数据. 一.腾讯to阿里文档链接:https://help.aliyun.com/document_detail/56990.html?spm=5176.7851628.6.1079.UqBdXKOssImport工具可以将本地.其它云存储的数据迁移到OSS,它有以下特点: 支持的丰富的数据源,有本地.七牛.百度BOS.AWS S3.Azure Blob.又拍云.腾讯云COS.金山KS3.HTTP.OSS等,并可根据需要扩展:支持断点续传:

PHP 腾讯云cos使用之我见

因为某些人的原因,本文从新改名发布一遍. 原名称:tp5 -- 腾讯云cos简单使用 原文链接:https://www.cnblogs.com/YFYQ/p/10840050.html 因项目需要,本来是需要对接阿里云oss,但因客户错误将云存储买成腾讯云cos,因此简单做了个对象上传使用 首先下载cos的sdk: 三种方式在文档上面都有介绍 SDK 安装有三种方式:Composer 方式.Phar 方式 和 源码方式. 本渣用的是最low 的源码方式 下载完成后解压放至TP5的第三方类库ext

腾讯云COS Api版本(不使用sdk)工具类

上一篇博文实现了阿里云OSS Api版本简单的上传和下载功能,这篇文章介绍腾讯云COS Api版本的上传下载功能 官方文档:https://cloud.tencent.com/document/product/436/7751 工具类代码: import org.apache.commons.codec.binary.Hex; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.codec.d

利用腾讯云COS云对象存储定时远程备份网站

版权声明:本文由张戈 原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/942851001487125915 来源:腾云阁 https://www.qcloud.com/community 一.优点分析 内网传输:和阿里云OSS一样,腾讯云COS同样支持内网和外网文件传输,对于腾讯云服务器,使用内网传输绝对是最快.最稳定的备份方案! 免费方案:看了下腾讯云COS的定价说明,发现对于备份网站来说简直是绝佳搭档,甚至可以说是钻

腾讯云COS对象存储的简单使用

叮当哥之前买了一年的腾讯云服务器,昨日偶然发现腾讯云送了叮当哥半年的cos对象存储服务器,于是就撸起袖子传了几张珍藏的高清大图上去,现将其上传的简单使用步骤总结一波(其它操作参加官方SDK文档API). 说明:这里叮当哥使用的是生成临时密钥的方式(好处多多哦) 第一步:创建Maven工程并导入相关坐标 <!-- 1.添加腾讯云指定的仓库地址 --> <repositories> <repository> <id>bintray-qcloud-maven-re

腾讯云COS,上传,下载,删除,在线查看等操作

研究了下文档,学会的先记录下. 首先新建工具类COSUtil. 配置账号密码.存储桶以生成客户端(每个方法下都需要配置,为了代码简洁后面的方法会省略): 1 String secretId = "root"; //初始化用户身份信息(secretId, secretKey). 2 String secretKey = "123456; 3 String bucketName = "test-1250000000"; //初始化存储桶 4 5 COSCred

关于调接口和腾讯云cos方面。

腾讯云的cos js jdk那个文档使用说明不好用. 都没看懂,而且图片上传也没有具体的详细.对于新手来说强制使用这个,弄得自己一头雾水. 工作效率就会下降. 为此我在网上搜了对象存储cos的常见错误. 对象存储COS常见问题大集结(2016年4月5日) 对象存储服务 PHp jquery基于cos上传头像组件 说真的全部都是php. 如果公司没有php,那用cos会出好多问题而且解决的时间成本太高. 为此我抱怨一下 作为前端我真的很不合格,如果没有后端,前端做这个腾讯cos什么都做不了.

腾讯云cos对象存储服务文件上传api就是一个大坑

一.介绍 对象存储服务(Cloud Object Service)是基于腾讯多年海量服务经验,对外提供的可靠.安全.易用的海量存储服务.提供多样化接入方式,以及全国部署的上传加速集群,可以无缝衔接CDN进行加速下载. 二.cos 文件上传api源码 /** * 单个文件上传,适用于小文件 * * @param bucketName * bucket名称 * @param remotePath * 远程文件路径 * @param localPath * 本地文件路径 * @return 服务器端返