【问题标题】:How to verify the signature made by metamask for ethereum?如何验证metamask为以太坊制作的签名?
【发布时间】:2021-07-20 12:17:27
【问题描述】:

我想在前端使用元掩码签署一条简单的消息,并在后端验证它以便让用户登录。

所以我在前端做:

const accounts = await web3.eth.getAccounts();
let sign = await web3.eth.personal.sign(`some message here`, accounts[0], '');

在后端验证用 Rust 编写的签名的最佳方法是什么?什么板条箱最适合这种任务?我会非常感谢任何真正的代码,因为我是 Rust 的新手。

谢谢你????

【问题讨论】:

标签: rust metamask


【解决方案1】:

这对我有用:

    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) 并对其进行哈希处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-31
    • 2018-02-03
    • 2022-08-16
    • 2021-11-15
    • 2019-03-29
    • 2020-01-27
    • 2022-01-19
    • 1970-01-01
    相关资源
    最近更新 更多