2017-06-22 141 views
1

我有一些地圖形式的數據,我將它轉換爲[] byt並對其進行簽名,驗證時,即使數據用於驗證和簽名是不同的。 這是我做的 -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.Signecdsa.Verify函數預計將採取加密散列函數的輸出,而不是消息本身。因此,在這種情況下,您正確地只檢查了前32個字節。

要解決該問題,首先使用加密哈希函數(如SHA-2)對消息進行哈希處理。