2017-06-22 1 views
1

私はマップ形式のデータをいくつか持っており、[]バイトに変換して署名しています。検証すると、確認と署名が異なります。 ここに私が行ったことがあります。go crypto/ecdsaデータが異なる場合でも真を与えることを確認する

func main(){ 
    n, _ := ioutil.ReadFile("privatekey") 

    private_key,_ := x509.ParseECPrivateKey(n) 
    public_key := private_key.PublicKey 


    data := map[string]string{ 
     "data1": "somestring", 
     "data2": "12312", 
     "data3": "34fs4", 
    } 

    json_data, _ := json.Marshal(data) 

    data_2 := map[string]string{ 
     "data1": "somestring", 
     "data2": "13312", 
     "data4": "fh34", 
    } 



    json_data_2,_ := json.Marshal(data_2) 

    r, s, _ := ecdsa.Sign(rand.Reader, private_key, json_data) 

    verifystatus := ecdsa.Verify(&public_key, json_data_2, r, s) 
    fmt.Println(verifystatus) 
} 

これは本当です。データを変更しようとしましたが、json_dataとjson_data_2に最初の32バイトの共通がある場合、Verifyはtrueを返します。 ecdsa.Verify()に送ることができるバイト配列の長さにある制限がありますか?もしそうなら、どうすれば大きなデータに使うことができますか?

答えて

2

golang ecdsa.Signおよびecdsa.Verify関数は、メッセージ自体ではなく、暗号化ハッシュ関数の出力を取ると予想されます。したがって、この場合、最初の32バイトだけが検査されているということは間違いありません。

この問題を解決するには、最初にSHA-2などの暗号化ハッシュ関数を使用してメッセージをハッシュします。

関連する問題