Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用x509公钥验证签名/哈希Alexa请求正文?_Java_Encryption_Sha1_X509_Alexa Skill - Fatal编程技术网

Java 如何使用x509公钥验证签名/哈希Alexa请求正文?

Java 如何使用x509公钥验证签名/哈希Alexa请求正文?,java,encryption,sha1,x509,alexa-skill,Java,Encryption,Sha1,X509,Alexa Skill,我正在努力完成我用Java开发的Alexa技能所列的步骤 我收到Alexa的一个请求,这是一个帖子。其中两个头是签名证书链url和签名 Amazon SHA1散列然后使用X509密钥对Alexa请求的整个正文进行签名,然后base64对签名正文进行编码。这是“签名”。签名证书链是我可以从中获取包含其公钥的X509证书链的url 我需要做的是base64解码签名,然后使用X509公钥解密签名。这给我留下了一个SHA1散列的请求主体。然后我需要自己对请求的主体进行散列,并对两者进行比较 我验证证书链

我正在努力完成我用Java开发的Alexa技能所列的步骤

我收到Alexa的一个请求,这是一个帖子。其中两个头是签名证书链url和签名

Amazon SHA1散列然后使用X509密钥对Alexa请求的整个正文进行签名,然后base64对签名正文进行编码。这是“签名”。签名证书链是我可以从中获取包含其公钥的X509证书链的url

我需要做的是base64解码签名,然后使用X509公钥解密签名。这给我留下了一个SHA1散列的请求主体。然后我需要自己对请求的主体进行散列,并对两者进行比较

我验证证书链。我提取公钥。我对帖子的主体进行散列,并生成一个派生的散列值(它的SHA1withRSA)。我对“签名”进行base64解码,然后使用公钥对其解密,以获得断言的哈希值

我无法生成与断言的哈希值匹配的派生哈希值。这就是我被困的地方,我不明白我做错了什么。我真的不太理解这个加密的东西,所以也许我遗漏了一些非常简单的东西

上面链接的第8步就是我被卡住的地方

首先,我借用了AlexaSDK的代码。问题是此代码似乎不起作用:


    Signature signature = Signature.getInstance(ServletConstants.SIGNATURE_ALGORITHM);
    signature.initVerify(signingCertificate.getPublicKey());
    signature.update(body);
        
    if (!signature.verify(Base64.decodeBase64(baseEncoded64Signature.getBytes(ServletConstants.CHARACTER_ENCODING)))) {
        throw new SecurityException("Failed to verify the signature/certificate for the provided skill request");
    }

SIGNATURE\u算法
=SHA1withRSA
字符编码
=UTF-8
签名证书
是X509证书

这段代码没有给我匹配的派生和断言哈希值。所以我遵循这个使用密码类的方法

我创建了一个临时文件,并将值硬编码到。我从请求中提取了尸体。我使用邮递员获取x509证书链的主体。我还从请求中获取了签名头


    byte[] decodedSignature = Base64.decodeBase64(encodedSignature);
    Cipher cipher = Cipher.getInstance("RSA");
    PublicKey key = signingCertificate.getPublicKey();
    cipher.init(Cipher.DECRYPT_MODE, key);
    
    byte[] decryptedSig = cipher.doFinal(decodedSignature);
    byte[] hashedBody = DigestUtils.sha1(body);

body
=将alexa请求的正文转换为字节
encodedSignature
=alexa请求中提供的签名头

显然,
decryptedSig
hashedBody
不匹配。见下文

decryptedSig
:48,33,48,9,6,5,43,14,3,2,26,5,0,4,20,-68,25,70,-54,-63,91,-37,73,34,82,-63,62,45,48,-117112,42,18,-24,-113

hashedBody
:-107,76,55,24,9,79,77,-21101,57,-103,25,42,-54,-28,5,34,-26117,38

问题是:我不知道问题是什么。就像我说的,我不懂这些东西。我只是想建立一个alexa技能,这是亚马逊的一部分

这是base64编码的签名:
2.目前,我国的一个研究项目是一个研究项目,一个研究项目是一个研究项目,一个研究项目,一个研究项目,一个研究项目,一个研究项目,一个研究项目,一个研究项目,一个研究项目,一个研究项目,一个研究项目,一个研究项目,一个研究项目,一个研究项目,一个研究项目,一个研究项目,一个研究项目,一个研究项目,一个研究项目,一个研究项目,一个研究项目,一个研究项目,一个研究项目,一个研究项目,一个研究项目,一个研究项目,一个研究项目一个研究项目,一个研究项目一个项目一个研究项目一个研究项目,一个研究项目一个研究项目一个研究项目,2。2。2。2。2。2。2。2。2。2。2。2。2。2。2。2。2。2。2。2。2。2。2。2。2。2。2。2。UGTK2+yow==

这是请求的主体:
{“version”:“1.0”,“session”:{“new”:false,“sessionId”:“amzn1.echo api.session.4ebd9d8c-d76c-403f-b82b-952492fffa74”,“application”:{“applicationId”:“amzn1.ask.skill.1ac44f3a-696a-4cc0-9944-6b7d9440b394”},“user”:{“userId”:“amzn1.ask.account.ago62c2okquigv4j6swhkoerzdpmylkhp5gaa67to6y6knogggkfhje6leysqtq6gjngngscdiquylmyfqxjpv53yezplw4ajpolh7tcmydkumzm2qxbedj43vrlkff6wub47aw7mrkvde427dqmyxyx3kifko7zcpjkgganemsnwzrgv6ybohpv3bb47kgshi”},“上下文”:“{”视口[{”类型“:”aplid“:”主“,”形状“,”矩形“,”标准“,”呈现“,”160”canRotate:false,“配置”:{“当前”:{“模式”:“中心”,“视频”:{“编解码器”:[“H_264_42”,“H_264_41”],“大小”:{“类型”:“离散”,“像素宽度”:1024,“像素高度”:600}}}}],“视口”:{“体验”:[{“arcMinuteWidth”:246,“arcMinuteHeight”:144,“canRotate:false”,“canResize:false}],“模式”:“中心”,“形状”:“矩形”,“像素宽度”:1024,“像素高度”:600,”dpi“:160,“currentPixelWidth”:1024,“currentPixelHeight”:600,“touch”:[“SINGLE”],“video”:{“codecs”:[“H_264_42”,“H_264_41”]}},System:{“application”:{“applicationId”:“amzn1.ask.skill.1ac44f3a-696a-4cc0-9944-6b7d9440b394”},“user”:{“userId”:”amzn1.ask.account.AGO62C2OKQUIGVD4J6SWHKOERZDPMYLKHP5GAA67Y6KNOGGGKFHJE6LEYSQQ6GJNGSCDIQUYLYMYFQXJPV53YEZPLW4AJPOLH7TCMYDKUMZM2QXBEDJ43VRLKFF6WUB47AWRKVDE427DQMYX3KIFK7ZCDPJKQGANEMSNWZRVM6YBOHPV3BB47PZKGSHI“,”设备:{“设备”:“设备”:“设备”:“设备:amzn1.ask.device.aglwbjs53gju5gt755hmymoh7mcgvsvqaicmzgbzuny2oe6dnqfg4k4umm3r5npjr6xshaabz44vvv6bour7svpzf5djuxctueaqtcrzsxkhwws7n4caehgk4vgbhjm57arcabspz4c4cwjx65zbz5n6lghzvxiphjmgqbpcygggwzie,“支持的接口”:{},“apiEndpoint”:”https://api.amazonalexa.com,“apiAccessToken”:Eyjhdwqijodhrwczzovl2为HBWF6B25HBGV4YS5JB20ILCJPC3IOIJBBGV4YVnRawXS2IiIiIiIjJJJYZQZJNnRnRWnRnRWnRnRjJFYZQ0ZJnRnRnRnRnRnRnRnRnRnNnRnNnWnNnWnWnJJJJJJJJYZQ0NnHnHnHnHnHnHnRnHnHnHnHnHnFnHnHnHnFnFnFnFnHnFnFnFnFnHnFnFnFnFnHnFnFnFnFnFnFnFnFnFnFnFnFnFnFnFnFnFnFnFnFnFnF2.他们的研究结果表明,他们的研究成果是一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于的的的的的的的的泽赫2.一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的中国的一个中国的一个中国的一个中国的一个中国的中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的中国的一个中国的一个中国的一个中国的中国的一个中国的中国的一个中国的一个中国的一个中国的一个中国的中国泽尔夫RZRLNFVNTTNSNU5QSLI2WFNIQUFCWJQ0VLY2QK9VUJDTVLBARJVVbUVRDQ1JAU1HLSFDxUzdonenbruhSzrW0JISK01N0FSQ0FCU1BANEM0EFDV0PYNJVAKTANU42TIWL