在 PHP 中验证以太坊 (Web3) 签名消息

问题描述 投票:0回答:3

如何使用 PHP 验证以太坊签名消息?

使用 Web3.js 中的

web3.personal.sign
函数对消息进行签名,然后将签名发送到服务器。我如何用PHP验证它?

是否有一些预构建的软件包(在 Packagist 上)或者我应该从头开始?是否可以在不连接 RPC 节点或链(链外)的情况下执行此操作?

我已经在以太坊 StackExchange 上发现了有关此问题,但它非常复杂且有点旧,所以我想知道是否有更新更好的解决方案。

我还在GitHub上找到了一些包,但我不知道它是否可以与

web3.personal.sign
一起使用。

我找到的一些链接:

php ethereum digital-signature web3php
3个回答
9
投票

可以使用包php-ecrecover验证签名消息。

您可以使用此包获取原始消息地址,然后验证它是否与预期地址相同。

JS 签名:

let message = 'Hello World!'
let address = web3.eth.coinbase

web3.personal.sign(web3.fromUtf8(message), address, console.log);

PHP 验证:

$address = '0xe12Aa5FB5659bb0DB3f488e29701fE303bcBAf65';
$message = 'Hello World!';
$signed = '0x2cb6b41177a5e6690ebbc61f182758fcf8f54403edcb848fc1089a772227d55163804b4dc7fcf72d15f0d977d741f6dd6bcc4fc4c74916378afcad06be77b2101b';

if ($address == personal_ecRecover($message, $signed)) {
    echo 'Message verified';
} else {
    echo 'Message not verified';
}

1
投票

在单个文件中有专门用于此目的的 php-ecrecover 函数的精简版本。

从个人签名消息(如 web3.eth.sign )获取公共地址。 第一个参数是原始消息,第二个参数是发送到服务器的签名值。 以“0x705...”形式返回的值是签署消息的公共地址。

require_once("ecrecover-simple.php");

$addr = \ECRecoverSimple\fromMessage(
     //Original message
    "Sign-In",
     //Signed message 
    "0xe4ad6b81ebd40bcd7420e95c7e5c88c64ba3fed80a06067078af7e0a9457f5a6728005fcab5d5abf80d5bed4bccae63338de0f0f369197d8dd12ee1b704c8ffe1c"
);

文件发布在这里: https://github.com/marcmasmar/php-ecrecover-simple

注意:这为已经有效的答案提供了一个特殊的且“仅限 64 位”的替代方案。它可能在轻量级场景以及没有能力或意愿运行 Composer 的情况下有所帮助。


-3
投票
[电子邮件受保护]

© www.soinside.com 2019 - 2024. All rights reserved.