更新时间:2020-11-03 17:22
本文介绍 API 订阅方应用如何使用 C# 语言对 HTTP 请求加签、验签。 API 网关提供了 C# SDK,即 mosng-sdk-csharp.zip。该 SDK 集成了加签、验签的逻辑,同时默认支持序列化和反序列化。
在进行本地应用开发前,您需要确保已经完成以下操作:
获取并安装 Visual Studio,可至 Visual Studio 官方网站 下载。
引入 C# SDK。
下载 SDK 及二进制文件 mosng-sdk-csharp.zip、HttpSignatures.dll.zip。
解压 mosng-sdk-csharp.zip 进入对应的目录后,双击 SDK 包 signature.sln
文件,将 C# SDK 引入 Visual Studio。
其中,HttpSignatures 项目为实现签名算法的共享库,可用于.Net Framework
与 .Net Core
项目。HttpSignatureTests 项目为调用示例。
定义要加签的 headers 和算法。
var spec = new SignatureSpecification(){
Algorithm = "hmac-sha256",
Headers = new string[] { "content-length", "host", "date", "(request-target)" },
KeyId = keyId
};
构建 request 对象。 您需要构建 request 对象,用于组装请求,代码示例如下:
var request = new Request();
request.Path = "/foo/Bar";
request.Method = HttpMethod.Get;
request.SetHeader("content-length", "18");
request.SetHeader("host", "example.org");
request.SetHeader("date", "Tue, 07 Jun 2014 20:51:35 GMT");
构建一个 signer 对象。
AuthorizationParser 对象包含 hmac-sha1、hmac-sha256、hmac-sha512 三种算法。HttpSignatureStringExtractor 对象初始化,用来加签 request 请求 header 中的字段。
代码示例如下:
var signer = new HttpSigner(new AuthorizationParser(), new HttpSignatureStringExtractor());
signer.Sign(request, spec, keyId, privateKey);
签名计算。
计算签名之后,签名信息放在 request 的 header[“Signature”] 里。
代码示例如下:
var signer = new HttpSigner(new AuthorizationParser(), new HttpSignatureStringExtractor());
signer.Sign(request, spec, keyId, privateKey);
签名验证。
取出 request 的 header[“Signature”] 里的加签信息并查询验证结果。
代码示例如下:
string s = signer.CalculateSignature(request, spec, privateKey);
Console.WriteLine(s);
Assert.AreEqual("yT/NrPI9mKB5R7FTLRyFWvB+QLQOEAvbGmauC0tI+Jg=", s);
[Test]
public void SignRequestTest2()
{
String authorization = "Signature keyId=\"hmac-key-1\",algorithm=\"hmac-sha256\",headers=\"content-length host date (request-target)\",signature=\"yT/NrPI9mKB5R7FTLRyFWvB+QLQOEAvbGmauC0tI+Jg=\"";
String keyId = "hmac-key-1"; // accessKey
String privateKey = "don't tell"; // secretKey
// 定义要加签的headers和算法
var spec = new SignatureSpecification()
{
Algorithm = "hmac-sha256",
Headers = new string[] { "content-length", "host", "date", "(request-target)" },
KeyId = keyId
};
// http 请求
var request = new Request();
request.Path = "/foo/Bar";
request.Method = HttpMethod.Get;
request.SetHeader("content-length", "18");
request.SetHeader("host", "example.org");
request.SetHeader("date", "Tue, 07 Jun 2014 20:51:35 GMT");
// 签名计算,计算之后,签名信息放在request的 header["Signature"] 里
var signer = new HttpSigner(new AuthorizationParser(), new HttpSignatureStringExtractor());
signer.Sign(request, spec, keyId, privateKey);
Console.WriteLine(request.GetHeader("Signature"));
Assert.AreEqual(authorization, request.GetHeader("Signature"));
// 独立的签名计算方法
string s = signer.CalculateSignature(request, spec, privateKey);
Console.WriteLine(s);
Assert.AreEqual("yT/NrPI9mKB5R7FTLRyFWvB+QLQOEAvbGmauC0tI+Jg=", s);
}
Base64(hmac-sha256(signing_string, Encoding.UTF8.GetBytes(private_key)))
Base64(hmac-sha512(signing_string, Encoding.UTF8.GetBytes(private_key)))
Base64(hmac-sha1(signing_string, Encoding.UTF8.GetBytes(private_key)))
目前没有对 HTTP 请求的 body 做摘要(digest)加签。
在文档使用中是否遇到以下问题
更多建议
匿名提交