如何使用 PHP 验证以太坊签名消息?
使用 Web3.js 中的
web3.personal.sign
函数对消息进行签名,然后将签名发送到服务器。我如何用PHP验证它?
是否有一些预构建的软件包(在 Packagist 上)或者我应该从头开始?是否可以在不连接 RPC 节点或链(链外)的情况下执行此操作?
我已经在以太坊 StackExchange 上发现了有关此问题,但它非常复杂且有点旧,所以我想知道是否有更新更好的解决方案。
我还在GitHub上找到了一些包,但我不知道它是否可以与
web3.personal.sign
一起使用。
我找到的一些链接:
可以使用包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';
}
在单个文件中有专门用于此目的的 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 的情况下有所帮助。