首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用GO验证AWS SNS签名

用GO验证AWS SNS签名
EN

Stack Overflow用户
提问于 2013-11-16 05:04:06
回答 2查看 2.1K关注 0票数 3

我想在GO中实现AWS SNS签名验证。这里是AWS提供的签名验证教程。

但是,有些地方我还是搞不懂。

7:生成Amazon消息的派生哈希值。以规范格式将Amazon消息提交到用于生成签名的相同哈希函数。

如何导出哈希值?我应该使用哪个散列函数?

8:生成Amazon消息的断言哈希值。断言的散列值是使用公钥值(从步骤3)解密与Amazon消息一起传递的签名的结果。

如何获得断言的哈希值

下面是我的代码,我有一个结构来通知

代码语言:javascript
运行
复制
type Notification struct {
    Message          string
    MessageId        string
    Signature        string
    SignatureVersion string
    SigningCertURL   string
    SubscribeURL     string
    Subject          string
    Timestamp        string
    TopicArn         string
    Type             string
    UnsubscribeURL   string
}

我已经生成了规范字符串

代码语言:javascript
运行
复制
    signString := fmt.Sprintf(`Message
%v
MessageId
%v`, self.Message, self.MessageId)

    if self.Subject != "" {
        signString = signString + fmt.Sprintf(`
Subject
%v`, self.Subject)
    }

    signString = signString + fmt.Sprintf(`
Timestamp
%v
TopicArn
%v
Type
%v`, self.Timestamp, self.TopicArn, self.Type)

来自的base64解码签名

代码语言:javascript
运行
复制
signed, err := base64.StdEncoding.DecodeString(self.Signature)

从.pem获得证书

代码语言:javascript
运行
复制
resp, _ := http.Get(self.SigningCertURL)
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
p, _ := pem.Decode(body)
cert, err := x509.ParseCertificate(p.Bytes)

现在,如何使用规范字符串验证签名?下面的代码正确吗?

代码语言:javascript
运行
复制
cert.CheckSignature(x509.SHA1WithRSA, signed, []byte(signString))

我总是从上面的代码中得到crypto/rsa: verification error

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-24 23:55:44

我知道这是一个很老的问题,但是我和记者有同样的问题,所以我花了一天的时间在AWS的帮助下解决了这个问题。我把我的工作开源为一个外部库,现在可以使用这里了。

您可以这样使用它(notificationJson是一个JSON字符串):

代码语言:javascript
运行
复制
import (
  "encoding/json"
  "fmt"

  "github.com/robbiet480/go.sns"
)

var notificationPayload sns.Payload
err := json.Unmarshal([]byte(notificationJson), &notificationPayload)
if err != nil {
  fmt.Print(err)
}
verifyErr := notificationPayload.VerifyPayload()
if verifyErr != nil {
  fmt.Print(verifyErr)
}
fmt.Print("Payload is valid!")

谢谢您在这个懒散的基础上的初步工作,我的库是基于您的上述代码!

票数 4
EN

Stack Overflow用户

发布于 2022-09-20 14:15:19

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20014908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档