当前位置: 首页 > 知识库问答 >
问题:

使用R的摘要包对Amazon Dynamodb的API的HTTP请求进行签名

澹台新知
2023-03-14

我试图使用Rs文摘包创建一个签名亚马逊的API为Dynamodb.签名需要sha256。目前,我正在测试R的摘要包,看看在我的输入下,它是否产生正确的输出。

根据亚马逊网站示例,如果我的输入为:

输入:"iam"

那么我的输出应该是:

目标输出:'f72cfd46f26bc4643f06a11eabb6c0ba18780c19a8da0c31ace671265e3c87fa'

当我使用以下R命令时:

digest("iam", algo="sha256", serialize=FALSE)

我得到以下输出:

"d457e3a99392a03f47057f50ac1cbc5d0365131575477971bf85177a0c0fed22"

我尝试过各种输入组合(设置serialize=TRUE等),但没有任何运气。

使现代化

根据Rohit的回复,我更新了我的R函数和方法,但仍然没有得到正确的样本签名。以下是我的步骤:

>

  • 基于Amazon计算AWS签名实例

    现在使用以下R公式/脚本:

    hmac(hmac(hmac(“AWS4wJalrXUtnFEMI/K7MDENG bPxRfiCYEXAMPLEKEY”,“20110909”,“sha256”,serialize=FALSE,raw=FALSE),“us-east-1”,“sha256”,serialize=FALSE,raw=FALSE),“iam”,“sha256”,serialize=FALSE,raw=FALSE),“aws4_请求”,“sha256”,serialize=TRUE,raw=TRUE)

    获得此结果:

    fe bd 15 b6 ac 8d 68 7a 93 f9 1c 9c dc 9e f8 d9 f1 79 fb a8 62 71 14 98 3a 35 0c 09 a0 ea 2e f5

    与Amazon示例中的示例签名不匹配:

    152 241 216 137 254 196 244 66 26 220 82 43 171 12 225 248 46 105 41 194 98 237 21 229 169 76 144 239 209 227 176 231
    

    我尝试在我的R函数上更改参数,但似乎与Amazon示例不匹配。如果有人有这方面的经验,或者我似乎做错了什么,我会感谢你的意见。谢谢

  • 共有1个答案

    冉丰茂
    2023-03-14

    我认为有两个地方存在问题。

    首先,AWS v4签名是一个HMAC,使用AWS密钥作为秘密(除其他外)。HMAC进程使用像MD5或SHA256这样的加密散列,但它不仅仅是单个数据块的散列(在您的情况下是“iam”),它还需要一个“秘密”。我想你会对R中的hmac函数更感兴趣-它可以使用SHA256作为“algo”。

    其次,如果您看看Java示例,了解如何计算签名和期望值:

    static byte[] HmacSHA256(String data, byte[] key) throws Exception  {
        String algorithm="HmacSHA256";
        Mac mac = Mac.getInstance(algorithm);
        mac.init(new SecretKeySpec(key, algorithm));
        return mac.doFinal(data.getBytes("UTF8"));
    }
    
    static byte[] getSignatureKey(String key, String dateStamp, String regionName, String serviceName) throws Exception  {
        byte[] kSecret = ("AWS4" + key).getBytes("UTF8");
        byte[] kDate    = HmacSHA256(dateStamp, kSecret);
        byte[] kRegion  = HmacSHA256(regionName, kDate);
        byte[] kService = HmacSHA256(serviceName, kRegion);
        byte[] kSigning = HmacSHA256("aws4_request", kService);
        return kSigning;
    }
    

    期望值

    kSecret  = '41575334774a616c725855746e46454d492f4b374d44454e472b62507852666943594558414d504c454b4559'
    kDate    = '969fbb94feb542b71ede6f87fe4d5fa29c789342b0f407474670f0c2489e0a0d'
    kRegion  = '69daa0209cd9c5ff5c8ced464a696fd4252e981430b10e3d3fd8e2f197d7a70c'
    kService = 'f72cfd46f26bc4643f06a11eabb6c0ba18780c19a8da0c31ace671265e3c87fa'
    kSigning = 'f4780e2d9f65fa895f9c67b32ce1baf0b0d8a43505a000a1a9e090d414db404d'
    

    您可以看到,k服务是使用kRegion计算的,它是使用kDate计算的,而kDate本身是使用AWS密钥计算的。所以你必须做一些类似的事情来计算签名。

     类似资料:
    • 我需要签署一条消息以提交到远程服务(通过websocket)。为此,我需要基于整数(我的用户id)和密码短语(base64编码字符串)构造私钥。,使用SHA224散列。我正在使用golang和crypto/ecdsa以及用于字节编码等的附带软件包。 以下是我的文档: 签名使用椭圆曲线数字签名算法(ECDSA)编码的消息,其中包含:用户ID、服务器Nonce、客户端节点和私钥。使用SHA224散列生

    • 我需要发送一个签名的XML文件到巴西的一个政府机构。问题是,我的Java代码(使用Java XML数字签名API)计算的摘要与使用另一个工具(如XMLSec)生成的摘要不同。 下面是我用来为某个XML节点生成XML签名的代码: 如果尝试使用xmlsec验证生成的XML,则会出现以下错误: 但如果我尝试使用xmlsec(使用相同的私钥)对同一文件(consult.xml)进行签名,则错误就会消失:

    • 问题内容: 我找到了我想免费玩的API。我想问一下是否要使用API​​开发Android应用,并且该API基于HTTP协议(RESTful),如何使用 HTTPClient 对象来实现? 我有一般要求的信息。 以上的回应将是成功的话。 我知道如何使用HTTPClient发送HTTP请求,但是否向请求中添加了额外的标头和其他不必要的内容?如何查看HTTPClient对象发出的请求?我只想简单地请求像

    • 问题内容: 我有一个Android应用程序,当前正在使用库来发出网络请求并使用来显示下载的图像。 我想测试的功能,由于我需要运行大量请求(数千个),因此我有点担心并行执行。处理的并行请求,将并行运行的请求限制为四个,而其他请求排队等待执行。在文档中,我找不到任何方法来处理并发请求的数量,而且我怀疑此类详细信息留给了此库中的开发人员。 这样对吗?如果是这样,是否有任何面向Android的实现/库可用

    • 我正在使用JAX-RS编写一个RESTful接口。当前正在编写索引资源以查看系统中有哪些对象可用。 第一条路由我想返回一个较短的对象形式,只包含、和属性,而第二条路由将返回完整的对象。 我希望这是很容易解决的,但是我不是一个Java专业的人,我希望有注释或某种帮助者来帮助解决这方面的问题。 编辑:如果没有,我想最简单的方法是创建一个摘要类(例如:)并返回它。

    • 问题内容: 我正在用PHP构建一个REST Web服务客户端,此刻我正在使用curl来向该服务发出请求。 如何使用curl发出经过身份验证的请求(http基本)?我必须自己添加标题吗? 问题答案: 你要这个: Zend有一个REST客户端和zend_http_client,我敢肯定PEAR有某种包装。但是它很容易自己完成。 因此,整个请求可能如下所示: