我试图让 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 回答
- 0 关注
- 596 浏览
添加回答
举报
0/150
提交
取消