go crypto/ecdsa验证即使数据不同也验证为真
问题描述:
我有一些地图形式的数据,我将它转换为[] 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()的字节数组的长度有一些限制吗?如果是这样,我怎么能用它来获取更大的数据?
答
该golang ecdsa.Sign
和ecdsa.Verify
函数预计将采取加密散列函数的输出,而不是消息本身。因此,在这种情况下,您正确地只检查了前32个字节。
要解决该问题,首先使用加密哈希函数(如SHA-2)对消息进行哈希处理。