热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ak和sk怎么认证海康威视_aksk鉴权

简介鉴权功能的位置处于基础服务的接入网关中。1.认证简介本鉴权方案是在api层面上进行,通过使用AccessKeySecretKey加密的方法来对验证某个请求的调用者

简介

鉴权功能的位置处于基础服务的接入网关中。

1. 认证简介

本鉴权方案是在api层面上进行,通过使用Access Key/Secret Key加密的方法来对验证某个请求的调用者身份。

当接入网关接收到业务调用方的请求时,将使用相同的SK和同样的认证机制生成认证字符串,并与用户请求中包含的认证字符串进行比对。如果认证字符串相同,系统认为用户拥有指定的操作权限,并执行相关操作;如果认证字符串不同,系统将忽略该操作并返回错误码。

2. 认证过程

业务云侧请求

note left of 业务云侧: 预置分配的AK/SK

业务云侧->业务云侧: 生成认证字符串

业务云侧->网关: 携带认证字符串的业务请求

网关->网关: 鉴权

网关-->业务云侧: 鉴权失败,返回401

网关->基础服务: 鉴权成功,透传请求

业务端侧请求

业务端侧->业务云侧: 获取携带认证字符串某个api的请求url

note right of 业务云侧: 预置分配的AK/SK

业务云侧->业务云侧: 生成认证字符串

业务云侧->业务端侧: 返回携带认证字符串的url

业务端侧->网关: 使用业务云侧返回的url进行业务请求

网关->网关: 鉴权

网关-->业务云侧: 鉴权失败,返回401

网关->基础服务: 鉴权成功,透传请求

3. 认证字符串生成简介

3.1 概述

在生成认证字符串之前,首先需要生成Signature。为了生成Signature,用户需要首先构建CanonicalRequest并计算SigningKey。

69a521c26d22d1d17c4c3c06b150810f.png

注:

函数名

功能描述

HMAC-SHA256-HEX()

调用HMAC SHA256算法,根据开发者提供的密钥(key)和密文(message)输出密文摘要,并把结果转换为小写形式的十六进制字符串。

Lowercase()

将字符串全部变成小写。

Trim()

去掉字符串开头和结尾的空白字符。

UriEncode()

RFC 3986规定,"URI非保留字符"包括以下字符:字母(A-Z,a-z)、数字(0-9)、连字号(-)、点号(.)、下划线(_)、波浪线(~),算法实现如下:

1. 将字符串转换成UTF-8编码的字节流

2. 保留所有“URI非保留字符”原样不变

3. 对其余字节做一次RFC 3986中规定的百分号编码(Percent-encoding),即一个“%”后面跟着两个表示该字节值的十六进制字母,字母一律采用大写形式。

UriEncodeExceptSlash()

与UriEncode() 类似,区别是斜杠(/)不做编码。一个简单的实现方式是先调用UriEncode(),然后把结果中所有的%2F都替换为/

3.2 生成canonicalRequest

CanOnicalRequest= HTTP Method + "\n" + CanonicalURI + "\n" + CanonicalQueryString + "\n" + CanonicalHeaders

HTTP Method:全部大写。支持五种:

GET

POST

PUT

DELETE

HEAD

CanonicalURI:是对URL中的绝对路径进行编码后的结果。要求绝对路径必须以“/”开头,不以“/”开头的需要补充上,空路径为“/”,即CanOnicalURI= UriEncodeExceptSlash(Path)。

举例:

若URL为https://bos.cn-n1.baidubce.com/example/测试,则其URL Path为/example/测试,将之规范化得到CanonicalURI = /example/%E6%B5%8B%E8%AF%95。

CanonicalQueryString:对于URL中的Query String(Query String即URL中“?”后面的“key1 = valve1 & key2 = valve2 ”字符串)进行编码后的结果。

编码方法为:

将Query String根据&拆开成若干项,每一项是key=value或者只有key的形式。

对拆开后的每一项进行如下处理:

对于key是authorization,直接忽略。

对于只有key的项,转换为UriEncode(key) + "="的形式。

对于key=value的项,转换为 UriEncode(key) + "=" + UriEncode(value) 的形式。这里value可以是空字符串。

将上面转换后的所有字符串按照字典顺序排序。

将排序后的字符串按顺序用 & 符号链接起来。

举例:

若URL为https://bos.cn-n1.baidubce.com/example?text&text1=测试&text10=test,在这个例子中Query String是 text&text1=测试&text10=test。

根据 & 拆开成 text 、text1=测试 和 text10=test 三项。

对每一项进行处理:

text => UriEncode("text") + "=" => text=

text1=测试 => UriEncode("text1") + "=" + UriEncode("测试") => text1=%E6%B5%8B%E8%AF%95

text10=test => UriEncode("text10") + "=" + UriEncode("test")=> text10=test

对 text= 、 text1=%E6%B5%8B%E8%AF%95 和 text10=test 按照字典序进行排序。它们有共同前缀text,但是=的ASCII码比所有数字的ASCII码都要大,因此 text1=%E6%B5%8B%E8%AF%95 和 text10=test 排在 text= 的前面。同样,text10=test 要排在 text1=%E6%B5%8B%E8%AF%95 之前。最终结果是 text10=test 、text1=%E6%B5%8B%E8%AF%95 、text= 。

把排序好的三项 text10=test 、 text1=%E6%B5%8B%E8%AF%95 、 text= 用&连接起来得到 text10=test&text1=%E6%B5%8B%E8%AF%95&text=。

CanonicalHeaders:对HTTP请求中的Header部分进行选择性编码的结果。

您可以自行决定哪些Header 需要编码。唯一要求是Host域必须被编码。大多数情况下,我们推荐您对以下Header进行编码,也可以使用其他header,此处不做限制:

Host

Content-Length

Content-Type

Content-MD5

对于每个要编码的Header进行如下处理:

将Header的名字变成全小写。

将Header的值去掉开头和结尾的空白字符。

经过上一步之后值为空字符串的Header忽略,其余的转换为 UriEncode(name) + ":" + UriEncode(value) 的形式。

把上面转换后的所有字符串按照字典序进行排序。

将排序后的字符串按顺序用\n符号连接起来得到最终的CanonicalQueryHeaders。

举例:

不使用signedHeaders默认值。若希望对 Date 进行编码,则需要用到signedHeaders。

要编码的Header如下:

Host: bj.bcebos.com

Date: Mon, 27 Apr 2015 16:23:49 +0800

Content-Type: text/plain

Content-Length: 8

Content-Md5: NFzcPqhviddjRNnSOGo4rw==

首先把所有名字都改为小写。

host: bj.bcebos.com

date: Mon, 27 Apr 2015 16:23:49 +0800

content-type: text/plain

content-length: 8

content-md5: NFzcPqhviddjRNnSOGo4rw==

将Header的值去掉开头和结尾的空白字符。

host:bj.bcebos.com

date:Mon, 27 Apr 2015 16:23:49 +0800

content-type:text/plain

content-length:8

content-md5:NFzcPqhviddjRNnSOGo4rw==

做UriEncode。

host:bj.bcebos.com

date:Mon%2C%2027%20Apr%202015%2016%3A23%3A49%20%2B0800

content-type:text%2Fplain

content-length:8

content-md5:NFzcPqhviddjRNnSOGo4rw%3D%3D?

把上面转换后的所有字符串按照字典序进行排序。

content-length:8

content-md5:NFzcPqhviddjRNnSOGo4rw%3D%3D?

content-type:text%2Fplain

date:Mon%2C%2027%20Apr%202015%2016%3A23%3A49%20%2B0800

host:bj.bcebos.com

将排序后的字符串按顺序用\n符号连接起来得到最终结果。

content-length:8

content-md5:NFzcPqhviddjRNnSOGo4rw%3D%3D?

content-type:text%2Fplain

date:Mon%2C%2027%20Apr%202015%2016%3A23%3A49%20%2B0800

host:bj.bcebos.com

这时候认证字符串的signedHeaders内容应该是

content-length;content-md5;content-type;date;host

3.3 生成SigningKey

SigningKey = HMAC-SHA256-HEX(sk, authStringPrefix),其中:

sk为用户的Secret Access Key,可以通过在控制台中进行查询,关于SK的获取方法,请参看获取AK/SK。

authStringPrefix代表认证字符串的前缀部分,即:auth-v1/{accessKeyId}/{timestamp}/{expirationPeriodInSeconds}。

3.4 生成Signature

Signature = HMAC-SHA256-HEX(SigningKey, CanonicalRequest)

3.5 生成认证字符串

认证字符串 = auth-v1/{accessKeyId}/{timestamp}/{expirationPeriodInSeconds}/{signedHeaders}/{signature}

timestamp:签名生效UTC时间,格式为yyyy-mm-ddThh:mm:ssZ,例如:2015-04-27T08:23:49Z,默认值为当前时间。(为实现方便,直接使用时间戳!!)

expirationPeriodInSeconds:签名有效期限,从timestamp所指定的时间开始计算,时间为秒,默认值为1800秒(30)分钟。

signedHeaders:签名算法中涉及到的HTTP头域列表。HTTP头域名字一律要求小写且头域名字之间用分号(;)分隔,如host;range;x-bce-date。列表按照字典序排列。当signedHeaders为空时表示取默认值。

来源: https://www.cnblogs.com/xxxuwentao/p/10344964.html



推荐阅读
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • PostgreSQL 10 离线安装指南
    本文详细介绍了如何在无法联网的服务器上进行 PostgreSQL 10 的离线安装,并涵盖了从下载安装包到配置远程访问的完整步骤。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文探讨如何设计一个安全的加密和验证算法,确保生成的密码具有高随机性和低重复率,并提供相应的验证机制。 ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
  • 探讨了小型企业在构建安全网络和软件时所面临的挑战和机遇。本文介绍了如何通过合理的方法和工具,确保小型企业能够有效提升其软件的安全性,从而保护客户数据并增强市场竞争力。 ... [详细]
author-avatar
Amyb__ing舒
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有