如何通过Delphi获得Azure Cosmo DB签名

如何通过Delphi获得Azure Cosmo DB签名,azure,delphi,azure-cosmosdb,Azure,Delphi,Azure Cosmosdb,我的项目需要通过RESTAPI连接Azure Cosmo DB。Azure Cosmo DB连接需要向HTTP头传递HMACSHA256签名。我试图在Delphi10.2中使用THashSHA2.GetHMAC(数据,键)函数来获得这个签名。为了验证结果,我在C#(从MS下载)中运行示例代码来验证Delphi生成的结果。不幸的是,它们不一样! C#:2LuKbSl8RkLc0eKhjQv4oCpXzRcmR02L9sDfSxSB5HA= 德尔福:2ca409c9a26aa3ed6c772b6bd

我的项目需要通过RESTAPI连接Azure Cosmo DB。Azure Cosmo DB连接需要向HTTP头传递HMACSHA256签名。我试图在Delphi10.2中使用THashSHA2.GetHMAC(数据,键)函数来获得这个签名。为了验证结果,我在C#(从MS下载)中运行示例代码来验证Delphi生成的结果。不幸的是,它们不一样! C#:2LuKbSl8RkLc0eKhjQv4oCpXzRcmR02L9sDfSxSB5HA= 德尔福:2ca409c9a26aa3ed6c772b6bda5bbe66bcd0d929c3ca4359f19ea42314437e5a 我通过在线HMACSHA256生成器验证了Delphi结果。德尔菲是正确的

我在网上搜索,想找到另一种生成签名的方法。我得到了TIdHMACSHA256(使用IdSSLOpenSSL.LoadOpenSSLLibrary)。我试过密码,但也没有成功。结果(96OYCOMXZODAP9CLJJGLUEG5J5C4NIDEISLR3HDCPYY=)也与C#生成的结果不同

我注意到C#代码运行Convert.FromBase64String(key)将密钥转换为字节,生成哈希,然后将.ToBase64String(hashPayLoad)转换为签名。我怀疑Delphi中的错误结果遗漏了这类步骤。但我不知道怎么做


有没有人有通过Delphi生成Azure Cosmo DB签名的经验?请帮忙

在搜索了所有可能的网站并进行了大量尝试和错误之后,我终于找到了解决方案。结果与从C#生成的签名相同。代码已从“”修改

函数generateComosDBSignature(const AData,AKey:string):string; 变量 AHMAC:TIdBytes; 字节:TBytes

开始

IdSSLOpenSSL.LoadOpenSSLLibrary

如果不是tidhasha256.i可用,则

raise Exception.Create('SHA-256 hashing is not available!');
使用TIdHMACSHA256.createdo

试一试

最后

Free;
结束

//原创的

//结果:=TIdEncoderMIME.EncodeBytes(AHMAC)

//修改后

结果:=AnsiString(tnetencode.Base64.EncodeBytesToString(System.TArray(AHMAC))


结束

使用Delphi System.Hash获取Cosmos DB签名的另一种方法

函数generateComosDBSignature(const AData,AKey:string):string; 变量 keyBytes,dataBytes:TBytes

开始

keyBytes:=TNetEncoding.Base64.DecodeStringToBytes(AKey); 数据字节:=TEncoding.UTF8.GetBytes(AData)

结果:=AnsiString(TNetEncoding.Base64.EncodeBytesToString(THashSHA2.GetHMACAsBytes(dataBytes,keyBytes))


结束

你把“Cosmos”拼错了,忽略了提到这些结果是否真的有效,没有显示你实际包含的生成哈希的内容。你看到了吗?很抱歉我的输入错误。我是新来的。我找不到任何编辑链接来更新我的问题。我使用了两个在web上找到的过程来散列签名。第一个函数GenerateSignature(const AData,AKey:string):string;var-AHMAC:TIdBytes;字节:TBytes;开始IdSSLOpenSSL.LoadOpenSSLLibrary;如果不是tidhasha256.i可用,那么。。。;使用TIdHMACSHA256.Create do键:=IndyTextEncoding\u UTF8.GetBytes(AKey);AHMAC:=哈希值(IndyTextEncoding_UTF8.GetBytes(AData))。。。。。结果:=tnetencode.Base64.Encode(AHMAC);结束;第二个结果:=THashSHA2.GetHMAC(ACode,AKey);它们都不会产生与C#相同的结果。很抱歉,我不知道如何在我的上述代码中添加换行符。
Free;