如何验证 metamask 为以太坊所做的签名?
How to verify the signature made by metamask for ethereum?
我想在前端使用 metamask 签署一条简单的消息,并在后端验证它以便让用户登录。
所以我在前端做的是:
const accounts = await web3.eth.getAccounts();
let sign = await web3.eth.personal.sign(`some message here`, accounts[0], '');
用 Rust 编写的后端验证签名的最佳方法是什么?什么样的箱子最适合这样的任务?我真的很感激任何真正的代码,因为我是 Rust 的新手。
谢谢
这对我有用:
use web3::signing::{keccak256, recover};
pub fn eth_message(message: String) -> [u8; 32] {
keccak256(
format!(
"{}{}{}",
"\x19Ethereum Signed Message:\n",
message.len(),
message
)
.as_bytes(),
)
}
#[test]
fn test_recover() {
let account = "0x63f9a92d8d61b48a9fff8d58080425a3012d05c8".to_string();
let message = "0x63f9a92d8d61b48a9fff8d58080425a3012d05c8igwyk4r1o7o".to_string();
let message = eth_message(message);
let signature = hex::decode("382a3e04daf88f322730f6a2972475fc5646ea8c4a7f3b5e83a90b10ba08a7364cd2f55348f2b6d210fbed7fc485abf19ecb2f3967e410d6349dd7dd1d4487751b").unwrap();
println!("{} {:?} {:?}", account, message, signature);
let pubkey = recover(&message, &signature[..64], 0);
assert!(pubkey.is_ok());
let pubkey = pubkey.unwrap();
let pubkey = format!("{:02X?}", pubkey);
assert_eq!(account, pubkey)
}
用
对原始邮件加盐非常重要
format!("{}{}{}","\x19Ethereum Signed Message:\n",message.len(),message)
并对其进行哈希处理。
我想在前端使用 metamask 签署一条简单的消息,并在后端验证它以便让用户登录。
所以我在前端做的是:
const accounts = await web3.eth.getAccounts();
let sign = await web3.eth.personal.sign(`some message here`, accounts[0], '');
用 Rust 编写的后端验证签名的最佳方法是什么?什么样的箱子最适合这样的任务?我真的很感激任何真正的代码,因为我是 Rust 的新手。
谢谢
这对我有用:
use web3::signing::{keccak256, recover};
pub fn eth_message(message: String) -> [u8; 32] {
keccak256(
format!(
"{}{}{}",
"\x19Ethereum Signed Message:\n",
message.len(),
message
)
.as_bytes(),
)
}
#[test]
fn test_recover() {
let account = "0x63f9a92d8d61b48a9fff8d58080425a3012d05c8".to_string();
let message = "0x63f9a92d8d61b48a9fff8d58080425a3012d05c8igwyk4r1o7o".to_string();
let message = eth_message(message);
let signature = hex::decode("382a3e04daf88f322730f6a2972475fc5646ea8c4a7f3b5e83a90b10ba08a7364cd2f55348f2b6d210fbed7fc485abf19ecb2f3967e410d6349dd7dd1d4487751b").unwrap();
println!("{} {:?} {:?}", account, message, signature);
let pubkey = recover(&message, &signature[..64], 0);
assert!(pubkey.is_ok());
let pubkey = pubkey.unwrap();
let pubkey = format!("{:02X?}", pubkey);
assert_eq!(account, pubkey)
}
用
对原始邮件加盐非常重要format!("{}{}{}","\x19Ethereum Signed Message:\n",message.len(),message)
并对其进行哈希处理。