使用Nethereum C#库生成签名异常:验证对应陌生钱包地址
问题:Nethereum生成的消息签名验证对应错误地址
使用Nethereum C#库对消息签名时无报错,但通过签名验证工具核对时,签名对应了错误的钱包地址。
原代码如下:
string privateKey = "privateKey"; string dataToSign = @"Welcome name"; string rpc = "https://1rpc.io/eth"; var web3 = new Web3(rpc); var signer = new EthereumMessageSigner(); string signature = signer.EncodeUTF8AndSign(dataToSign, new EthECKey(privateKey)); Console.Writeline(signature);
问题原因
核心问题出在换行符的编码差异:
- C#中用
@定义的多行字符串,在Windows系统下会生成\r\n(Windows换行符) - 签名验证工具默认使用Unix风格的
\n换行符处理消息 - 两者的字节内容不同,导致最终生成的消息哈希不一致,验证时匹配到错误地址
另外,代码中初始化的Web3对象并未实际使用,可以移除。
修正方案
统一消息中的换行符为Unix风格,确保签名和验证时的消息字节完全一致:
修正后的代码
string privateKey = "privateKey"; // 将Windows换行符替换为Unix风格 string dataToSign = @"Welcome name".Replace("\r\n", "\n"); var signer = new EthereumMessageSigner(); // 直接处理字节数组,避免编码歧义 byte[] messageBytes = System.Text.Encoding.UTF8.GetBytes(dataToSign); string signature = signer.Sign(messageBytes, new EthECKey(privateKey)); Console.WriteLine(signature);
验证说明
生成新签名后,再去验证工具核对,即可匹配到正确的钱包地址。
内容的提问来源于stack exchange,提问作者Евгений Агарков
相关产品推荐
相关产品推荐

