1 回答
TA贡献1111条经验 获得超0个赞
使用 SHA256 验证 PKCS1v15
我通过尝试验证方案和哈希类型的所有组合发现了这一点;我没有找到保证这是将使用的签名方案的文档。
但是对于无畏者来说,下面是一个对数据进行签名并验证签名的代码示例。
package yourpackage
import (
"crypto"
"crypto/rsa"
"crypto/x509"
"encoding/pem"
"errors"
"google.golang.org/appengine"
"net/http"
)
func signAndVerify(request *http.Request) error {
c := appengine.NewContext(request)
data := []byte("test data to sign")
_, sig, err := appengine.SignBytes(c, data)
if err != nil {
return err
}
certs, err := appengine.PublicCertificates(c)
if err != nil {
return err
}
lastErr := errors.New("ErrNoPublicCertificates")
for _, cert := range certs {
block, _ := pem.Decode(cert.Data)
if block == nil {
lastErr = errors.New("ErrPemDecodeFailure")
continue
}
x509Cert, err := x509.ParseCertificate(block.Bytes)
if err != nil {
lastErr = err
continue
}
pubkey, ok := x509Cert.PublicKey.(*rsa.PublicKey)
if !ok {
lastErr = errors.New("ErrNotRSAPublicKey")
continue
}
signBytesHash := crypto.SHA256
h := signBytesHash.New()
h.Write(data)
hashed := h.Sum(nil)
err = rsa.VerifyPKCS1v15(pubkey, signBytesHash, hashed, sig)
if err != nil {
lastErr = err
continue
}
return nil
}
return lastErr
}
我还在github 上的一个包中发布了验证步骤。
更新
Google 提供了一些验证 SignBytes 的示例代码。其中,有一个文件app-identity-samples-read-only/python/app_identity_test.py有一个名为buildjwt创建由 SignBytes 签名的 JWT 的方法,并且 JWT 算法是 RS256,它在RFC 7518 中定义为使用 SHA-256 的 RSASSA-PKCS1-v1_5。
注意:我将Go App Engine 用于托管 VM(请参阅“google.golang.org/appengine”导入)而不是经典的 Go App Engine 运行时,尽管对于 SignBytes 的目的来说并没有太大的不同。
- 1 回答
- 0 关注
- 196 浏览
添加回答
举报