为了账号安全,请及时绑定邮箱和手机立即绑定

在Java中验证在golang中生成的rsa.SignPKCS1v15签名

在Java中验证在golang中生成的rsa.SignPKCS1v15签名

Go
眼眸繁星 2021-09-27 16:42:39
我试图让 Java 验证签名的 SHA-1 哈希,但它一直返回 false。我在 Go 中有以下代码,它生成一个 RSA 密钥对并签名并返回任何到达 /sign 端点的消息以及十六进制编码的散列和公钥模数和指数:package mainimport (    "crypto"    "crypto/rand"    "crypto/rsa"    "encoding/hex"    "encoding/json"    "fmt"    "io"    "net/http"    "strconv")var PrivKey *rsa.PrivateKeytype Message struct {    Message string `json:"message"`}func (msg *Message) Decode(r io.Reader) error {    return json.NewDecoder(r).Decode(&msg)}type Signature struct {    Hash      string `json:"hash"`    Signature string `json:"signature"`    N         string `json:"N"`    E         string `json:"E"`}func hash(msg string) []byte {    sh := crypto.SHA1.New()    sh.Write([]byte(msg))    hash := sh.Sum(nil)    return hash}func SignWithKey(msg Message) Signature {    hash := hash(msg.Message)    bytes, err := rsa.SignPKCS1v15(rand.Reader, PrivKey, crypto.SHA1, hash)    if err != nil {        panic(err)    }    signature := hex.EncodeToString(bytes)    sig := Signature{        hex.EncodeToString(hash),        signature,        PrivKey.PublicKey.N.String(),        strconv.Itoa(PrivKey.PublicKey.E),    }    return sig}func sign(w http.ResponseWriter, r *http.Request) {    fmt.Println("/sign")    var msg Message    err := msg.Decode(r.Body)    if err != nil {        panic(err)    }    fmt.Println("Signing: " + msg.Message)    signature := SignWithKey(msg)    js, err := json.Marshal(signature)    fmt.Println(string(js))    w.Header().Set("Content-Type", "application/json")    w.Write(js)}func LoadKeys() {    // generate private key    var err error    PrivKey, err = rsa.GenerateKey(rand.Reader, 2048)    if err != nil {        fmt.Println(err)    }}func main() {    fmt.Println("Loading Keys")    LoadKeys()    fmt.Println("Keys Loaded")    http.HandleFunc("/sign", sign)    http.ListenAndServe(":8080", nil)}在 Java/Android 端,我有这个代码,它在发送相关位后使用未解析的 JSON 对象命中这个函数,但是一旦它到达签名验证部分,它总是返回 false
查看完整描述

3 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

在 Java 中,您不需要在签名或验证消息之前散列消息。这意味着发送到 sig.update 的字节不应该是 hashedBytes,而是 inputBytes。


查看完整回答
反对 回复 2021-09-27
?
郎朗坤

TA贡献1921条经验 获得超9个赞

如果您不想在 Go 中对内容进行哈希处理而只对原始数据进行签名,则可以使用以下代码:

signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.Hash(0), []byte(message))



查看完整回答
反对 回复 2021-09-27
  • 3 回答
  • 0 关注
  • 559 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信