【问题标题】:Azure: create SAS manuallyAzure:手动创建 SAS
【发布时间】:2020-05-06 12:43:57
【问题描述】:

我正在尝试实现一个用于创建 SAS 令牌的 Perl 函数。根据文档执行所有操作 (https://docs.microsoft.com/en-us/rest/api/storageservices/create-service-sas) 我总是收到错误“签名字段格式不正确”。

我的测试资源是“https://ribdkstoragepoc.blob.core.windows.net/project-poc/foo/koteyka.jpg”。我的代码填充的变量:

签名权限 = 'r'

已签名到期 = '2020-05-01T07:59:00Z'

canonicalizedresource = '/blob/ribdkstoragepoc/project-poc/foo/koteyka.jpg'

签名资源 = 'b'

签名版本 = '2018-03-28'

其他变量只是空行。我使用以下模式生成一个字符串:

我的 $stringToSign = $权限。 “\n”。 $开始。 “\n”。 $到期。 “\n”。 $canonicalizedResource 。 “\n”。 $标识符。 “\n”。 $IP 。 “\n”。 $协议。 “\n”。 $版本。 “\n”。 $资源。 “\n”。 $快照时间。 “\n”。 $rscc 。 “\n”。 $rscd 。 “\n”。 $rsce 。 “\n”。 $rscl 。 “\n”。 $rsct;

要签名的字符串:

r

2020-05-01T07:59:00Z
/blob/ribdkstoragepoc/project-poc/foo/koteyka.jpg



2018-03-28
b






计算签名:my $sig = Digest::SHA::hmac_sha256_base64($stringToSign, $key);

最终的 URL 看起来像:https://ribdkstoragepoc.blob.core.windows.net/project-poc/foo/koteyka.jpg?sig=YcwWvOT2FtOZGbXQxMAoSxvA2HhRmMAUp%2B6WUY%2Bjbjg&sv=2018-03-28&se=2020-05-01T07%3A59%3A00Z&sr=b&sp=r

正如我已经说过的那样,这是行不通的。有谁知道可能出了什么问题?

【问题讨论】:

  • 你能编辑你的问题并包含stringToSign的值吗?
  • 感谢更新。你的stringToSign 在我看来还可以。您可以尝试将以下代码更改为:$sig = Digest::SHA::hmac_sha256_base64($stringToSign, $key);$sig = Digest::SHA::hmac_sha256_base64($stringToSign, decode_base64($key));
  • @GauravMantri 已经完成了:$key 是 decode_base64( $key_b64) );

标签: azure perl blob


【解决方案1】:

找出您的代码有什么问题。基本上,您使用的是 2018-03-28 版本的 Storage REST API,因此您不需要在 $stringToSign 中包含 $resource$snapshotTime

此外,您需要使用 1-4 =(参考:https://github.com/smarx/waz-storage-perl/blob/master/WindowsAzure/Storage.pm#L42)填充您的签名。

基于这些,代码如下:

use strict;
use warnings;
use Digest::SHA qw(hmac_sha256_base64);
use MIME::Base64;

my $permissions = 'r';
my $start = '';
my $expiry = '2020-01-31T00:00:00Z';
my $canonicalizedResource = '/blob/ribdkstoragepoc/project-poc/foo/koteyka.jpg';
my $identifier = '';
#my $resource = 'b';
my $IP = '';
my $version = '2018-03-28';
my $protocol = '';
#my $snapshotTime = '';
my $rscc = '';
my $rscd = '';
my $rsce = '';
my $rscl = '';
my $rsct = '';

my $stringToSign = $permissions . "\n" . $start . "\n" . $expiry . "\n" . $canonicalizedResource . "\n" . $identifier . "\n" . $IP . "\n" . $protocol . "\n" . $version . "\n" . $rscc . "\n" . $rscd . "\n" . $rsce . "\n" . $rscl . "\n" . $rsct;

print $stringToSign;

my $accountKey = 'your-base64-account-key';

my $sig = Digest::SHA::hmac_sha256_base64($stringToSign, decode_base64($accountKey));
$sig .= '=' x (4 - (length($sig) % 4));
print "\n---------------------\n";

print $sig;

print "\n";

试试这个,应该可以的。

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 2020-05-05
    • 2021-03-01
    相关资源
    最近更新 更多