1 回答

TA貢獻(xiàn)1111條經(jīng)驗(yàn) 獲得超0個(gè)贊
使用 SHA256 驗(yàn)證 PKCS1v15
我通過(guò)嘗試驗(yàn)證方案和哈希類(lèi)型的所有組合發(fā)現(xiàn)了這一點(diǎn);我沒(méi)有找到保證這是將使用的簽名方案的文檔。
但是對(duì)于無(wú)畏者來(lái)說(shuō),下面是一個(gè)對(duì)數(shù)據(jù)進(jìn)行簽名并驗(yàn)證簽名的代碼示例。
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 上的一個(gè)包中發(fā)布了驗(yàn)證步驟。
更新
Google 提供了一些驗(yàn)證 SignBytes 的示例代碼。其中,有一個(gè)文件app-identity-samples-read-only/python/app_identity_test.py有一個(gè)名為buildjwt創(chuàng)建由 SignBytes 簽名的 JWT 的方法,并且 JWT 算法是 RS256,它在RFC 7518 中定義為使用 SHA-256 的 RSASSA-PKCS1-v1_5。
注意:我將Go App Engine 用于托管 VM(請(qǐng)參閱“google.golang.org/appengine”導(dǎo)入)而不是經(jīng)典的 Go App Engine 運(yùn)行時(shí),盡管對(duì)于 SignBytes 的目的來(lái)說(shuō)并沒(méi)有太大的不同。
- 1 回答
- 0 關(guān)注
- 225 瀏覽
添加回答
舉報(bào)