我想在GO中实现AWS SNS签名验证。这里是AWS提供的签名验证教程。
但是,有些地方我还是搞不懂。
7:生成Amazon消息的派生哈希值。以规范格式将Amazon消息提交到用于生成签名的相同哈希函数。
如何导出哈希值?我应该使用哪个散列函数?
8:生成Amazon消息的断言哈希值。断言的散列值是使用公钥值(从步骤3)解密与Amazon消息一起传递的签名的结果。
如何获得断言的哈希值
下面是我的代码,我有一个结构来通知
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
}
我已经生成了规范字符串
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解码签名
signed, err := base64.StdEncoding.DecodeString(self.Signature)
从.pem获得证书
resp, _ := http.Get(self.SigningCertURL)
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
p, _ := pem.Decode(body)
cert, err := x509.ParseCertificate(p.Bytes)
现在,如何使用规范字符串验证签名?下面的代码正确吗?
cert.CheckSignature(x509.SHA1WithRSA, signed, []byte(signString))
我总是从上面的代码中得到crypto/rsa: verification error
。
谢谢!
发布于 2016-02-24 23:55:44
我知道这是一个很老的问题,但是我和记者有同样的问题,所以我花了一天的时间在AWS的帮助下解决了这个问题。我把我的工作开源为一个外部库,现在可以使用这里了。
您可以这样使用它(notificationJson是一个JSON字符串):
import (
"encoding/json"
"fmt"
"github.com/robbiet480/go.sns"
)
var notificationPayload sns.Payload
err := json.Unmarshal([]byte(notificationJson), ¬ificationPayload)
if err != nil {
fmt.Print(err)
}
verifyErr := notificationPayload.VerifyPayload()
if verifyErr != nil {
fmt.Print(verifyErr)
}
fmt.Print("Payload is valid!")
谢谢您在这个懒散的基础上的初步工作,我的库是基于您的上述代码!
发布于 2022-09-20 14:15:19
在讨论Amazon消息签名验证时,还需要注意,Amazon现在支持基于SHA256散列的消息签名:
以下是发布的博客文章:
https://stackoverflow.com/questions/20014908
复制相似问题