ethercard php_PHP如何通过编程在服务端验证以太坊签名

2023-11-15

以太坊有一个非常强大的JavaScript生态系统。有一些很棒的开源项目,比如ethereumjs-util,它提供了一个用以太坊帐户签名的即插即用功能。

JavaScript的一个缺点是,在许多领域,它带来了安全问题。一个这样的安全风险是显而易见,这是由于我努力在EthTools.com上实现持久性认证(仍然是一个正在进行的被警告了的工作)。

利用开源项目(如ethereumjs-util)来签署任意的数据消息是相当容易的。然而,不容易的是告诉服务器有人已经成功地验证了某帐号的所有权。

当然这也不是绝对正确的,你也可以很容易做到这一点。简单地构建一个简单的API端点,并在成功认证后向其发出请求。

真正的问题是,创建一个“假”请求并将其发送到上述(易于识别 - 只需在控制台中查看)端点非常容易。 我可以轻松发出请求,说我已经验证了任何帐户的所有权。

凭借尖端技术……特别是处理“真实价值”的技术,尤其重要的是安全性体现出了它应有的重要性并被重视,特别是在历史上出现各种被利用的攻击的情况下。

而且即使是在初期,以太坊也吸引了最优秀的人——那些知道在做什么的人。如果有安全漏洞,有人会找到它。

现在。。虽然可以确保AJAX请求和伪造更难,但几乎不可能使交易100%的安全。我需要另一种方式。

我最终解决的方法是选择最简单的服务器端认证方式。

对每个人交易都是可视化的

在客户端中与区块链交互的一件大事是,在任何情况下,任何人都能清楚地看到你在做什么。他们可以自信地知道你没有把他们的私人钥匙发送给别人。怎样?他们可以查看控制台并查看每一个发出的请求。

38c3a745b36a36fa97b3a09cec1c5bb7.png

如果一个服务在任何地方POSTing我的私钥,我会非常担心。

在我们实现的认证流中,用户可以看到我们没有在任何地方发送任何数据——所有的东西都是在客户端中完成的。

遗憾的是,我的身份验证方案中确实需要POSTing数据。但也不用担心(有些人可能不同意)。

我们POST身份验证的公钥到我们的API端点。虽然你不能用服务器上的公钥来验证我们所做的事情,但我们并没有用你的公钥做任何恶作剧——这就是为什么它是公开的。

在服务器上,我们使用提交的公钥来验证提交的签名是由具有相应私钥信息的人创建的。这里要明确指出,我们不知道你的私钥,但椭圆曲线加密允许我们通过简单地使用公钥来验证签名是否是使用它创建的。

在ethereumjs-util和solidity中,ecrecover方法是前提,除非这些工作分别在客户端和区块链中。

在以太坊论坛上,chriseth给出了ecrecover的以下有用解释:

ecrecover的思想是,可以计算对应于用于创建ECDSA签名的私钥的公钥,这两个额外的字节通常是由签名提供的。签名本身是椭圆曲线点R和S的两个(编码),而V是恢复公钥所需的两个附加位。

这也解释了为什么返回类型是地址:它返回对应于恢复的公钥(即其sha3/keccak的哈希)的地址。这意味着要实际验证签名,检查返回的地址是否等于相应的私钥应该已经签署哈希的那个地址。

我们希望在服务器上有相同的功能。

注意:Solidity的ecrecover返回一个地址,而ethereumjs-utils的ecrecover返回一个公钥。

注:研究期间,我发现了一些有趣的StackExchange的问题主题。这些内容如下:

web3.js API文档还提供了一些关于ecrecover的参数的见解:

After the hex prefix, characters correspond to ECDSA values like this:

r = signature[0:64]

s = signature[64:128]

v = signature[128:130]

Note that if you are using ecrecover, v will be either "00" or "01". As a result, in order to use this value, you will have to parse it to an integer and then add 27. This will result in either a 27 or a 28.

PHP中怎么做

[EthTools.com]是建立在Phalcon PHP框架之上的。

没有真正意义上的以太坊PHP社区,PHP在处理数值表示方面有其缺点。

当然,椭圆曲线密码的问题是极其复杂的,而我对它也缺乏已经掌握的可用知识。

在大量的资料查询研究和大量的开发调试之后,我成功地实现了PHP中的ecrecover功能。

虽然我知道如何做到这一点,我写了一些“笔记”,我整理和包含在下面的内容,希望能帮助别人了解正确的方向。

我的行动逻辑是使用ethereumjs-util,使用已知的以太坊私钥签署交易。然后,我会模仿PHP中的ecrecover方法的代码路径,然后像宏播放一样执行,直到从签名返回的输出公共密钥与原始签名帐户匹配。

所以…

在Node中,缓存 Buffers是无符号8位整数的数组。 digits 是它们的10进制(十进制)表示。

8位就会有2^8=255个十进制选项。这些整数是来自UTF-8字符集的字符的数字编码表示。

Node利用这些缓存来进行这些计算所需的排序的数据操作。

在服务器上,我们有不同的字符串(消息哈希和签名),但是PHP不知道这些字符串中的字节是base 16 numerical表示(十六进制)。

每个字符都是一个“小写”,它需要4个字节来表示(允许十六进制字符是0—9和A—F)。

这样,8位数据是两个十六进制字符。

在Node中,将字符串“61BF09”转换为一个buffer,通过将两个小写的集合转换成它的十进制形式。

61转成97

bf转成191

09转成9

要在PHP中执行等效,我们执行如下的操作:

$r_byte_array = unpack('C*', hex2bin($r));

我们调用hex2bin,它将十六进制字符串(不含0x)转换为二进制表示(base 2)。通过调用这个方法,我们隐式地说明初始格式是十六进制。

unpack然后将字符串转换为代码中的数组——我们的Buffer等价物。

最初PHP只是认为字符串是UTF-8。如果我们不先调用hex2bin,第一个int是54,效果是这样:

f17049ceefce93e2bbf2183e1a091194.png

这是因为unpack只是将UTF8中的第一个字节(54)转换成二进制代码(6),64个字符=64个代码点。

当我们告诉unpack我们处理十六进制时,它将每个两个字节的十六进制集合(每个代表4位数据的字符)转换为它的十进制表示。61(0x61)变为97。我们的64个字节十六进制字符串变成32个8位整数,效果是这样:

a0059a96ed3f6c5cb1fd07a3287a4bd0.png

你可以通过使用这个转换器来看这些不同的表示。

现在,你就有一个符合要求并且已经格式化了的消息哈希和签名表示,“你可以作弊了”。

我比较懒和喜欢自做聪明。也就是说,让我试图充分理解、欣赏和实施secp256k1椭圆曲线是根本不会发生的。此外…何苦?这是一个不需要重新发明的轮子。

我发现了一些与secp256k1有关的php库。例如:

我最终使用了所有三个库的组合,我喜欢知道我在使用什么,并且基本上(至少)理解我正在向服务器推送什么。上面的库是相当丰富的、复杂的,我只是简单提取我需要的相对简单的功能。

在花了大量的时间来了解我正在做的事情之后,我终于成功地实现了我想要达到的目标——我已经成功地验证了以太坊客户端中创建的签名是来自我的一个特定的私钥。

当我第一次爬进这个rabbit hole的时候,我会继续实施我所想到的功能。

注意事项。2018年又我写了第二篇文章,详细介绍了我如何验证PHP先前签署的消息的有效性。(注:后面也会翻译给大家)

如果大家在学习用php开发以太坊那我们推荐这个教程:

php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和事件等内容。

汇智网原创翻译,转载请标明出处。这里是原文

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ethercard php_PHP如何通过编程在服务端验证以太坊签名 的相关文章

  • yum软件安装

    yum软件安装 1 软件安装卸载 安装rpm包 显示详细信息和进度条 rpm ivh vsftpd 3 0 2 25 el7 x86 64 rpm 查看vsftpd安装情况 rpm q vsftpd 删除已安装软件 rpm e vsftpd
  • uniapp返回上一页,回到顶部实现【记录】

    CSS样式中传入变量 鑫动了的主页 欢迎各位小伙伴 前端小白的成长之路 一起学习 一起成长 在返回上一页时如果不想停留在当前位置 想点击或者自动回到顶部可以用下面的方法 注 使用了scroll view并设置高度时再使用 uni pageS
  • nginx worker_connections exceed 1024 修改

    玩nginx配置的朋友 有时会见到这个提示 warn 3660 0 20000 worker connections are more than open file resource limit 1024 原来安装好nginx之后 默认最大
  • 对多态的理解

    1 虚函数 定义 前面有virtual关键字的成员函数就是虚函数 2 什么是多态 一 将派生类的指针赋给基类指针 则可通过基类指针调用派生类的同名虚函数 include
  • Qt项目实战杂谈一二:网页/应用嵌入技术

    这一篇 应该说是满满的诚意了 很早之前就有完成此篇的打算 奈何一直没有时间 要么是沉迷于编码无法自拔 要么就是执着于释放身心的游戏而偷偷爽快不已 今天 我们说说老牌软件的一个趋势 和对应的某些技术细节的实现点 可能有点长 看这写吧 过长可能
  • The type or namespace name '****' could not be found (are you missing a using directive or an assemb...

    错误的提升内容 具体情况 本人出现这种问题的情况是这样的 本人解决方案的主 exe项目的目标框架情况如下 而 该项目所依赖的附加类库项目的目标框架为 4 5 造成在 exe项目中 无法识别所引用的类库 而出现下图左所示的黄色三角形标志 此外
  • 问题解决:记录一次Linux服务器根目录突然爆满

    一 出问题了 过了个双休来到公司 同时发现Linux终端的服务器状态中根目录空间直接爆满100 周五走之前根目录仅仅使用了59 同时项目服务的后台不停的有日志打印 而且测试的小伙伴说系统登录不上去了 下面记录一下个人排查并解决这个问题的全过
  • 解决电脑无法通过网线直连海康摄像机的问题

    一 现象 通过博主的另外一篇博客https blog csdn net u014552102 article details 86700057 配置完海康网络摄像机后 摄像机可以通过路由器wifi传输视频声音 并通过手机客户端和电脑客户端播
  • VUE项目本地运行调试遇到问题,npm run,install 报错

    IDE 随意选择 太多了 VSCode webstorm 一 安装node js npm vue cli 这三个东西教程挺多的 我这里就不详细说了 我之前开发的时候安装过 查看当前电脑上有没有安装 注意V的大小写 node v npm v
  • Vue.js怎么给文本域赋默认值,和获取输入的值

    Vue js怎么给文本域赋默认值 一般给文本域赋初值用于修改某个东西 需要获取默认值 可以用v model来完成
  • Sublime Text 3 文本编辑器软件

    为什么80 的码农都做不了架构师 gt gt gt http www xiazaiba com html 24343 html Sublime Text 2 设置文件详解 http linux cn article 799 1 html S
  • 45类商标分类表明细表

    商标注册分类采用的是尼斯分类 尼斯联盟成员国采用 商标注册用商品和服务国际分类 尼斯分类将商品和服务分成45个大类 其中商品为1 34类 服务为35 45类 商标局将尼斯分类的商品和服务项目划分类似群 并结合实际情况增加我国常用商品和服务项
  • SpringBoot使用多数据源时怎么解决事务不生效问题

    在使用多数据源时 如果不进行特殊处理 可能会出现事务不生效的问题 这是因为 Spring Boot 默认只会为一个数据源创建一个事务管理器 如果要使用多个数据源 就需要为每个数据源创建一个事务管理器 并在需要使用事务的方法或类上指定使用哪个
  • Istio Pilot源码学习(二):ServiceController服务发现

    本文基于Istio 1 18 0版本进行源码学习 4 服务发现 ServiceController ServiceController是服务发现的核心模块 主要功能是监听底层平台的服务注册中心 将平台服务模型转换成Istio服务模型并缓存
  • linux环境下设置用户密码过期期限

    关于密码过期时间和用户过期时间的设置 通常使用chage命令和usermod命令 设置某个用户的过期时间 accountexpires 可以用usermod e来设置 查看某个用户的密码 passwordexpires 过期时间等信息 可以
  • Java里Controller层参数不必填

    public Result
  • KNN算法的一个回归应用分析

    介绍 在我所接触的机器学习算法中 KNN是一种相对来说较容易理解的算法 但是它在实际中仍有十分广泛的应用 KNN算法可以用于分类和回归问题 在分类问题中应用较多 虽然KNN很少用于回归问题 但对于连续的变量仍有很好的效果 下面我们来介绍KN
  • 一篇打通,pytest自动化测试框架详细,从0到1精通实战(一)

    前言 pytest单元测试框架 1 什么是单元测试框架 单元测试是指在软件开发当中针对软件的最小单位 函数 方法 进行正确性的检查测试 2 单元测试框架有哪些 Java junit 和 testing python unittest 和 p

随机推荐

  • 整理了一些常用的免费api接口,不限次数,收藏备用~(持续更新...)

    API Application Program Interface 被定义为应用程序可用以与计算机操作系统交换信息和命令的标准集 一个标准的应用程序界面为用户或软件开发商提供一个通用编程环境 以编写可交互运行于不同厂商计算机的应用程序 AP
  • ISP_matlab

    确定输入是否为结构体数组字段 MATLAB isfield MathWorks 中国 对话框打开文件 获取路径和文件名 file path uigetfile raw RAW fid fopen fullfile path file htt
  • 百度通用翻译api使用

    官方api文档 http api fanyi baidu com api trans product apidoc springboot demo地址 https github com Blankwhiter translate 第一步 注
  • python web界面模板_Python简单轻量级Web Server模块Bottle

    Bottle 提示 使用此WEB服务器模块需要有基本的HTTP知识 简单 轻量级指的是 上手不难 容易使用 模块不大还能完成一般Web服务器的功能 Bottle是Python平台的轻量级Web Server 准确的说是HTTP Server
  • node.js在idea里运行

    Node js 是一种运行在 Chrome V8 JavaScript 引擎上的基于 JavaScript 的客户端运行时 JavaScript runtime 它可以用于构建网络应用程序和服务 在 Node js 中 你可以使用多种构建工
  • 从数据库字符串中获取数字部分,用于数据分析

    目录 前言 一 思路 1 获取字符串中的小数及整数部分 代码 效果 解析 2 获取字符串中数字部分 代码 效果 解析 二 总结 前言 在大数据时代 我们经常要分析很多非结构化的数据 同时也要分析很多非标准的数据 如 0 78吨 CYJ23w
  • 【数据结构 001】 定义

    数据 能被计算机处理 能被计算机识别 能输入计算机 数据元素 有一定意义的基本单位 数据项 数据元素的组成单位 认为是数据结构中最小组成单位 数据对象 具有相同性质的数据元素的集合 数据结构 存在特定关系的数据的集合 数据之间特定的结构关系
  • 线性表(C++实现)

    线性表的定义与基本操作 定义 具有相同数据类型的n个数据元素的有限序列 n是表长 当n为0的时候线性表是一个空表 如果用L命名线性表 那么其一般表示为 L a 1
  • 山谷 蓝桥杯

    问题描述 给定一个字母矩阵 如果矩阵中的某个位置不在四条边上 而且该位置上的字母小于其上下左右四个位 置的字母 则称为一个山谷 例如 对于如下矩阵 DDDDD CADCE FFFFA 共有两个山谷 位于第二行第二列和第四列 请注意第二行第三
  • 计算机网络-----网络编程

    网络编程 实战 网络基础 1 什么是计算机网络 2 什么是网络编程 3 网络编程中的主要问题 4 网络通信要素 5 通信协议分层思想 IP和端口号 1 IP 1 1定义 1 2IP的分类 2 端口号 2 1定义 2 2端口号的分类 网络通信
  • [转]Datagridview中的数据很多,加载完数据后滚动条自动到最下边的方法

    this dataGridView1 FirstDisplayedScrollingRowIndex this dataGridView1 Rows Count 1 转载于 https www cnblogs com aooyu archi
  • svn checkout 报 ‘svn: E000061: 执行上下文错误: Connection refused‘

    问题 svn E170013 svn E000061 svn svn checkout https xxx xxx xxx xxx 9443 svn project xxx svn E170013 Unable to connect to
  • php校验密码js,JS的密码强度校验正则表达式(附代码)

    这次给大家带来JS的密码强度校验正则表达式 附代码 使用JS的密码强度校验正则表达式注意事项有哪些 下面就是实战案例 一起来看一下 最近一直在做通行证项目 里面的注册模块中输入密码需要显示密码强度 低中高 今天就把做的效果给大家分享下 代码
  • 再谈二维数组,二级指针

    首先注意一个事实 是一个运算符 称 为 下 标 运 算 符 亦 称 变 址 运 算 符 我觉得应该是变址取内容 p n 恒 等于 p n 我们不能简单把指针看成地址 不要忽略掉数据类型 也就是说一个指针包含两方面 一个是地址 一个是数据类型
  • Nutanix是超融合厂商?原来我们都误会了……

    Nutanix是一家超融合厂商吗 是 也不是 中国的很多用户在初次接触Nutanix公司时 它已经在全球的超融合市场上声誉鹊起 并且被奉为超融合的鼻祖 所以人们先入为主地认为 Nutanix就是一家超融合厂商 作为一个新的细分产品市场的领导
  • Vijava 学习笔记之(VirtualMachineCloneSpec)

    VirtualMachineCloneSpec 指定虚拟机克隆规范 NAME TYPE DESCRIPTION config VirtualMachineConfigSpec 指定虚拟机的配置信息 customization Customi
  • http://www.baidu.com/cb.php?,搜索引擎中文网站提交登陆入口(09年完整汇总)

    7 雅虎中国 等同于易搜 提交 http search help cn yahoo com h4 4 html 8 TOM提交提交 http search tom com tools weblog log php 9 alltheweb 提
  • 数据结构六大排序详解(插入排序、希尔排序、选择排序、冒泡排序、快速排序、堆排序)

    数据结构六大排序详解 插入排序 希尔排序 选择排序 冒泡排序 快速排序 1 排序的概念 2 数据结构五大排序 2 1 插入排序 2 2 希尔排序 2 3 选择排序 2 4 冒泡排序 2 5 快速排序 2 5 1 hoare版本 左右指针法
  • 手把手教你开发微信小程序自定义底部导航栏

    手把手教你开发微信小程序自定义底部导航栏 一 创建微信小程序 二 配置底部菜单 1 配置app json文件 增加底部菜单 三 增加自定义底部菜单 1 app json配置文件 tabBar 增加 custom true 2 添加导航图标
  • ethercard php_PHP如何通过编程在服务端验证以太坊签名

    以太坊有一个非常强大的JavaScript生态系统 有一些很棒的开源项目 比如ethereumjs util 它提供了一个用以太坊帐户签名的即插即用功能 JavaScript的一个缺点是 在许多领域 它带来了安全问题 一个这样的安全风险是显