海康威视-综合安防管理平台(iSecure Center)签名规则C#

这篇具有很好参考价值的文章主要介绍了海康威视-综合安防管理平台(iSecure Center)签名规则C#。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

海康开放平台海康威视合作生态致力打造一个能力开放体系、两个生态圈,Hikvision AI Cloud开放平台是能力开放体系的核心内容。它是海康威视基于多年在视频及物联网核心技术积累之上,融合AI、大数据、云计算等技术,为合作伙伴提供的一个二次开发及创新的平台。https://open.hikvision.com/docs/docId?productId=5c67f1e2f05948198c909700&version=%2Ff95e951cefc54578b523d1738f65f0a1&curNodeId=a0f95defa04344f8b3582eb839eccf70文章来源地址https://www.toymoban.com/news/detail-501912.html

public class HIKOpenAPI
    {


        public static string HttpPost(string url,string api, string body, string ak, string sk) {

            Log.Logs("user", Log.LogType.Info, $"Send|| url(api).{url + api}");
            Log.Logs("user", Log.LogType.Info, $"Send|| body.{body}");

            var headers = new Dictionary<string, string> { { "Accept", "*/*" }, { "Content-Type", "application/json" } };

            var request = new Request(Method.POST_STRING, url, api, ak, sk, 10000) {
                Headers = headers,
                SignHeaderPrefixList = null,
                Querys = null,
                StringBody = body
            };

            var result= DoPoststring(request.Host, request.Path, request.Timeout, request.Headers, request.Querys, request.StringBody, request.SignHeaderPrefixList, request.AppKey, request.AppSecret, false);

            Log.Logs("user", Log.LogType.Info, $"Recv|| result.{result}");

            return result;
        }

        //Post请求方法
        public static string DoPoststring(string host, string path, int connectTimeout, Dictionary<string, string> headers,
            Dictionary<string, string> querys, string body, List<string> signHeaderPrefixList, string appKey,
            string appSecret, bool autoDown)
        {
            try
            {
                headers = initialBasicHeader("POST", path, headers, querys, null, signHeaderPrefixList, appKey,
                    appSecret);
                ServicePointManager.ServerCertificateValidationCallback =
                    RemoteCertificateValidate;
                    //验证服务器证书回调自动验证
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 |
                                                       SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
                HttpWebRequest request = (HttpWebRequest) WebRequest.Create(initUrl(host, path, querys));
                request.KeepAlive = false;
                request.ProtocolVersion = HttpVersion.Version10;
                //设置HTTP协议的并发连接数
                //ServicePointManager.DefaultConnectionLimit = 512;
                //关闭重定向
                request.AllowAutoRedirect = false;
                request.Method = "POST";
                request.Timeout = connectTimeout;
                string accept = headers["Accept"];
                request.Accept = accept;
                string contentType = headers["Content-Type"];
                request.ContentType = contentType;

                foreach (string headerKey in headers.Keys)
                {
                    if (headerKey.Contains("x-ca-"))
                    {
                        request.Headers.Add(headerKey + ":" +
                                            (string.IsNullOrWhiteSpace(headers[headerKey]) ? "" : headers[headerKey]));
                    }
                    if (headerKey.Equals("tagId"))
                    {
                        request.Headers.Add(headerKey + ":" +
                                            (string.IsNullOrWhiteSpace(headers[headerKey]) ? "" : headers[headerKey]));
                    }
                }



                if (!string.IsNullOrWhiteSpace(body))
                {
                    byte[] postBytes = Encoding.UTF8.GetBytes(body);
                    request.ContentLength = postBytes.Length;
                    Stream requestStream = request.GetRequestStream();

                    requestStream.Write(postBytes, 0, postBytes.Length);
                    requestStream.Close();
                }


                var response = (HttpWebResponse) request.GetResponse();
                var result = "";
                if (response.StatusCode != HttpStatusCode.OK) return result;
                using (StreamReader rdr = new StreamReader(response.GetResponseStream()))
                {
                    result = rdr.ReadToEnd();
                }

                return result;
            }
            catch (Exception ex)
            {
                return new  {code="404",msg= ex.Message }.Json();
            }
        }


        //获取当时时间戳
        public static long GetTimestamp(DateTime time)
        {
            System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1, 0, 0, 0, 0));
            long t = (time.Ticks - startTime.Ticks)/10000; //除10000调整为13位      
            return t;

        }

        private static bool RemoteCertificateValidate(object sender, X509Certificate cert, X509Chain chain,
            SslPolicyErrors error)
        {
            //为了通过证书验证,总是返回true
            return true;
        }

        public static Dictionary<string, string> initialBasicHeader(string method, string path,
            Dictionary<string, string> headers, Dictionary<string, string> querys, Dictionary<string, string> bodys,
            List<string> signHeaderPrefixList, string appKey, string appSecret) //throws MalformedURLException
        {
            if (headers == null)
            {
                headers = new Dictionary<string, string>();
            }
            headers["x-ca-timestamp"] = GetTimestamp(DateTime.Now).ToString();
            //headers["x-ca-nonce"] = "5d1b5861-2e04-4bdc-ab02-d393acc6e8df";
            headers["x-ca-nonce"] = System.Guid.NewGuid().ToString();
            headers["x-ca-key"] = appKey;
            headers["x-ca-signature"] = sign(appSecret, method, path, headers, querys, bodys, signHeaderPrefixList);

            return headers;
        }

        public static string initUrl(string host, string path, Dictionary<string, string> querys)
            //throws UnsupportedEncodingException
        {
            StringBuilder sbUrl = new StringBuilder();
            sbUrl.Append(host);
            if (!string.IsNullOrWhiteSpace(path))
            {
                sbUrl.Append(path);
            }

            if (null != querys)
            {
                StringBuilder sbQuery = new StringBuilder();

                foreach (string queryKey in querys.Keys)
                {
                    if (0 < sbQuery.Length)
                    {
                        sbQuery.Append("&");
                    }

                    if (string.IsNullOrWhiteSpace(queryKey) && !string.IsNullOrWhiteSpace(querys[queryKey]))
                    {
                        sbQuery.Append(querys[queryKey]);
                    }

                    if (!string.IsNullOrWhiteSpace(queryKey))
                    {
                        sbQuery.Append(queryKey);
                        if (!string.IsNullOrWhiteSpace(querys[queryKey]))
                        {
                            sbQuery.Append("=").Append(HttpUtility.UrlEncode(querys[queryKey], Encoding.UTF8));
                        }
                    }
                }

                if (0 < sbQuery.Length)
                {
                    sbUrl.Append("?").Append(sbQuery);
                }
            }
            return sbUrl.ToString();
        }

        public static string sign(string secret, string method, string path, Dictionary<string, string> headers,
            Dictionary<string, string> querys, Dictionary<string, string> bodys, List<string> signHeaderPrefixList)
        {
            try
            {
                //return HmacSHA256(buildstringToSign(method, path, headers, querys, bodys, signHeaderPrefixList), secret);

                /*---message里的内容---*/
                //POST
                //*/*
                //application/json
                //x-ca-key:23125513
                //x-ca-nonce:12d28d90-a7c3-45cc-ae6a-0cc8d5e22118
                //x-ca-timestamp:1544495633599
                //artemis/api/resource/v1/org/advance/orgList
                string message = buildstringToSign(method, path, headers, querys, bodys, signHeaderPrefixList);

                return HmacSHA256(message, secret);
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }

        public static string buildstringToSign(string method, string path, Dictionary<string, string> headers,
            Dictionary<string, string> querys, Dictionary<string, string> bodys, List<string> signHeaderPrefixList)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append(method.ToUpper()).Append("\n");
            if (null != headers)
            {
                if (null != headers["Accept"])
                {
                    sb.Append((string) headers["Accept"]);
                    sb.Append("\n");
                }

                if (headers.Keys.Contains("Content-MD5") && null != headers["Content-MD5"])
                {
                    sb.Append((string) headers["Content-MD5"]);
                    sb.Append("\n");
                }

                if (null != headers["Content-Type"])
                {
                    sb.Append((string) headers["Content-Type"]);
                    sb.Append("\n");
                }

                if (headers.Keys.Contains("Date") && null != headers["Date"])
                {
                    sb.Append((string) headers["Date"]);
                    sb.Append("\n");
                }
            }

            sb.Append(buildHeaders(headers, signHeaderPrefixList));
            sb.Append(buildResource(path, querys, bodys));
            return sb.ToString();
        }

        public static string buildHeaders(Dictionary<string, string> headers, List<string> signHeaderPrefixList)
        {
            StringBuilder sb = new StringBuilder();
            if (null != signHeaderPrefixList)
            {
                signHeaderPrefixList.Remove("x-ca-signature");
                signHeaderPrefixList.Remove("Accept");
                signHeaderPrefixList.Remove("Content-MD5");
                signHeaderPrefixList.Remove("Content-Type");
                signHeaderPrefixList.Remove("Date");
                signHeaderPrefixList.Sort();
            }

            if (null != headers)
            {
                Dictionary<string, string> sortDictionary = new Dictionary<string, string>();
                sortDictionary = headers;
                //按key值升序排序
                var dicSort = from objDic in sortDictionary orderby objDic.Key ascending select objDic;

                StringBuilder signHeadersStringBuilder = new StringBuilder();

                foreach (KeyValuePair<string, string> kvp in dicSort)
                {
                    if (kvp.Key.Replace(" ", "").Contains("x-ca-"))
                    {
                        sb.Append(kvp.Key + ":");
                        if (!string.IsNullOrWhiteSpace(kvp.Value))
                        {
                            sb.Append(kvp.Value);
                        }
                        sb.Append("\n");
                        if (signHeadersStringBuilder.Length > 0)
                        {
                            signHeadersStringBuilder.Append(",");
                        }
                        signHeadersStringBuilder.Append(kvp.Key);
                    }
                }

                headers.Add("x-ca-signature-headers", signHeadersStringBuilder.ToString());
            }

            //x-ca-key:23125513
            //x-ca-nonce:12d28d90-a7c3-45cc-ae6a-0cc8d5e22118
            //x-ca-timestamp:1544495633599

            return sb.ToString();
        }

        public static string buildResource(string path, Dictionary<string, string> querys, Dictionary<string, string> bodys)
        {
            StringBuilder sb = new StringBuilder();
            if (!string.IsNullOrWhiteSpace(path))
            {
                sb.Append(path);
            }

            Dictionary<string, string> sortDictionary = new Dictionary<string, string>();
            if (querys != null)
            {
                //按key值升序排序
                var dicSort = from objDic in querys orderby objDic.Key ascending select objDic;
                foreach (KeyValuePair<string, string> kvp in dicSort)
                {
                    if (!string.IsNullOrWhiteSpace(kvp.Key))
                    {
                        sortDictionary[kvp.Key] = kvp.Value;
                    }
                }
            }

            if (bodys != null)
            {
                //按key值升序排序
                var dicSort = from objDic in bodys orderby objDic.Key ascending select objDic;
                foreach (KeyValuePair<string, string> kvp in dicSort)
                {
                    if (!string.IsNullOrWhiteSpace(kvp.Key))
                    {
                        sortDictionary[kvp.Key] = kvp.Value;
                    }
                }
            }

            StringBuilder sbParam = new StringBuilder();

            //按key值升序排序
            var dicSortDictionary = from objDic in sortDictionary orderby objDic.Key ascending select objDic;
            foreach (KeyValuePair<string, string> kvp in dicSortDictionary)
            {
                if (!string.IsNullOrWhiteSpace(kvp.Key))
                {
                    if (sbParam.Length > 0)
                    {
                        sbParam.Append("&");
                    }
                    sbParam.Append(kvp.Key);
                    if (!string.IsNullOrWhiteSpace(kvp.Value))
                    {
                        sbParam.Append("=").Append(kvp.Value);
                    }
                }
            }

            if (0 < sbParam.Length)
            {
                sb.Append("?");
                sb.Append(sbParam);
            }
            //artemis/api/resource/v1/org/advance/orgList
            return sb.ToString();
        }

        public static string HmacSHA256(string message, string secret)
        {
            secret = secret ?? "";
            var encoding = new System.Text.UTF8Encoding();
            byte[] keyByte = encoding.GetBytes(secret);
            byte[] messageBytes = encoding.GetBytes(message);
            using (var hmacsha256 = new HMACSHA256(keyByte))
            {
                byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
                return Convert.ToBase64String(hashmessage);
            }
        }

        public static Dictionary<string, object> ConvertMapTimeStyle(Dictionary<string, object> paramMap)
        {
            Dictionary<string, object> timeMap = new Dictionary<string, object>();
            try
            {
                foreach (string key in paramMap.Keys)
                {

                    object mapValueObj = paramMap[key];
                    Dictionary<string, object> dic = mapValueObj as Dictionary<string, object>;
                    if (dic != null)
                    {
                        ConvertMapTimeStyle(dic);
                    }
                    //时间格式参数转为ISO8601
                    DateTime mapDate;
                    if (DateTime.TryParse(paramMap[key].ToString(), out mapDate))
                    {
                        string ISO8601time = mapDate.ToString("yyyy-MM-ddTHH:mm:ss.fffzzz");
                        timeMap.Add(key, ISO8601time);
                    }
                }
                if (timeMap.Count > 0)
                {
                    foreach (string key in timeMap.Keys)
                    {
                        paramMap[key] = timeMap[key];
                    }
                }
                return paramMap;
            }
            catch (Exception ex)
            {
                return paramMap;
            }
        }



        public enum Method
        {
            GET,
            POST_FORM,
            POST_STRING,
            POST_BYTES,
            PUT_FORM,
            PUT_STRING,
            PUT_BYTES,
            DELETE
        }

        public  class Request
        {
            public Request()
            {
            }

            public Request(Method method, string host, string path, string appKey, string appSecret, int timeout)
            {
                this.Method = method;
                this.Host = host;
                this.Path = path;
                this.AppKey = appKey;
                this.AppSecret = appSecret;
                this.Timeout = timeout;
            }

            public Method Method { get; set; }

            public string Host { get; set; }

            public string Path { get; set; }

            public string AppKey { get; set; }

            public string AppSecret { get; set; }

            public int Timeout { get; set; }

            public Dictionary<string, string> Headers { get; set; }

            public Dictionary<string, string> Querys { get; set; }

            public Dictionary<string, string> Bodys { get; set; }

            public string StringBody { get; set; }

            public byte[] BytesBody { get; set; }

            public List<string> SignHeaderPrefixList { get; set; }
        }
    }

到了这里,关于海康威视-综合安防管理平台(iSecure Center)签名规则C#的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 海康威视iSC 平台第三方对接门禁权限分享

    一、 场景描述 iSC 平台的门禁产品及功能在项目应用广泛,第三方对接门禁权限功能的需求也越来也 多,由于门禁权限下发需要涉及到往设备上下发,第三方接口调用一旦不正确,不合理的接 口调用很容易给我们平台造成额外的性能消耗,甚至导致我们平台挂掉,特此梳理

    2024年02月02日
    浏览(332)
  • 视频安防监控EasyCVR平台海康大华设备国标GB28181告警布防的报文说明

    TSINGSEE青犀视频监控综合管理平台EasyCVR基于云边端协同,可支持海量视频的轻量化接入与汇聚管理。平台既具备传统安防视频监控的能力,比如:视频监控直播、云端录像、云存储、录像检索与回看、告警上报、平台级联、云台控制、语音对讲等,也能接入AI智能分析的能力

    2024年02月14日
    浏览(46)
  • 海康硬盘录像机接入RTSP/onvif协议安防视频平台EasyNVR的注意事项

    EasyNVR安防视频云服务平台可支持设备通过RTSP/Onvif协议接入平台,能提供视频监控直播、录像、云存储、检索与回看、国标级联等视频能力,可支持分发RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等格式的视频流。 有用户咨询,将海康硬盘录像机接入EasyNVR平台后显示离线,不知道什

    2024年02月05日
    浏览(78)
  • 安防监控/视频存储/视频汇聚平台EasyCVR接入海康Ehome车载设备出现收流超时的原因排查

    安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。视频汇聚平台既具备传统安防视频监控的能力,也具

    2024年02月10日
    浏览(53)
  • 安防监控/视频汇聚/云存储/AI智能视频分析平台EasyCVR下级海康设备无法级联是什么原因?

    安防视频监控平台/视频集中存储/云存储/磁盘阵列EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。 有用户反馈,在使用下级平台的海康设备级联到视频

    2024年02月09日
    浏览(48)
  • 【Microsoft Azure 的1024种玩法】二十六. 在Azure VM中手动部署Windows Admin Center管理平台

    Windows Admin Center是微软开发的一套可以部署在本地基于浏览器的GUI的工具集平台,其平台可用于管理Windows相关服务器和PC机器,我们可以利用Windows Admin Center完全控制整个服务器的各个方面基础结构,是windows系列内部管理工具中(服务器管理及MMC)的演进版本,因Windows Admin

    2024年02月04日
    浏览(59)
  • 海康威视接口调用

    综合安防管理平台提供了OpenAPI安全认证库(Java)快速实现接口调用。 Java实现接口调用步骤如下: 新建Java工程,从Hikvision AI Cloud开放平台网站(海康开放平台)上下载“OpenAPI安全认证库(Java)”,获取artemis-http-client.jar,导入到Java工程中。 设置认证信息,设置ArtemisConfi

    2024年02月03日
    浏览(65)
  • 海康威视后台监控布防

    由于公司业务的需要,前端时间一直在折腾海康摄像头的对接。在这期间踩过许多坑,做一记录分享。 大致的业务场景,主要用到的是海康的 Ai 摄像头与高清摄像头,实现监控布防与实时画面在 web 页面展示预览。 对于 Ai 摄像头内部已经上传了训练好的模型,直接调用海康

    2024年02月06日
    浏览(86)
  • 海康威视接口在线调试

    一、在线调试页面有两种进入方式,请选择适合您的进入方式: 1、能登录iSC平台运管中心, 选择方法一 ; 2、不能登录iSC平台运管中心, 选择方法二 ; 二、进入在线调试页面方法介绍 方法一: 登录运管中心,进入到API网关-API列表页面后(可以在机器人中搜索‘合

    2024年02月12日
    浏览(71)
  • 基于海康SDK实现Python调用海康威视网络摄像头

    本文参考博客,写得很好: Python调用海康威视网络相机之——python调用海康威视C++的SDK Python调用海康威视网络相机C++的SDK 写本文的目的,也是快速复盘,所以没有很详细 保存视频流到本地可参考下一篇:基于海康SDK实现Python保存海康威视网络摄像头拍摄的视频 Windows11 Vis

    2024年02月02日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包