讲师中心 微信公众号
AI工具推荐 视频效率加速

PHP解析v3版Tor洋葱地址:提取公钥、校验和与版本信息

浅丽大大_4584

浅丽大大_4584

发布时间:2025-11-19 10:20:18

|

332人浏览过

|

来源于php中文网

原创

php解析v3版tor洋葱地址:提取公钥、校验和与版本信息

本文详细阐述如何使用PHP程序化地解析v3版Tor洋葱地址。通过遵循Tor的rend-spec-v3规范,我们将深入探讨洋葱地址的结构,学习如何从Base32编码的字符串中精确提取出服务公钥、校验和以及版本号,并提供具体的PHP实现代码,以帮助开发者理解并应用这些解析技术。

理解v3洋葱地址结构

Tor的v3洋葱地址设计旨在提供更高的安全性和更强的匿名性。其核心结构是一个Base32编码的字符串,该字符串由三个关键组件拼接而成:服务身份公钥(PUBKEY)、校验和(CHECKSUM)和版本号(VERSION)。完整的洋葱地址格式为 base32(PUBKEY | CHECKSUM | VERSION) + ".onion"。

  • PUBKEY (公钥): 这是一个32字节的Ed25519主公钥,用于唯一标识隐藏服务。
  • CHECKSUM (校验和): 这是一个2字节的校验值,通过对特定常量字符串、公钥和版本号进行哈希计算并截取前两字节得到。其计算公式为 H(".onion checksum" | PUBKEY | VERSION)[:2]。
  • VERSION (版本号): 这是一个1字节的版本字段,当前v3洋葱地址的默认值为 \x03(即十进制的3)。

因此,一个Base32解码后的v3洋葱地址字符串总长度为 32 (PUBKEY) + 2 (CHECKSUM) + 1 (VERSION) = 35 字节。

PHP实现:解析v3洋葱地址

要从v3洋葱地址中提取这些组件,我们需要执行以下步骤:

SSL
SSL

配置HTTPS,管理TLS证书,并调试安全连接问题。

下载

立即学习PHP免费学习笔记(深入)”;

  1. 移除 .onion 后缀: 首先,从完整的洋葱地址中移除末尾的 .onion 字符串,以获得纯粹的Base32编码部分。
  2. Base32解码: 对剩余的字符串进行Base32解码。解码结果将是一个35字节的二进制字符串。
  3. 提取组件: 根据v3洋葱地址的结构定义,从解码后的二进制字符串中按顺序提取公钥、校验和和版本号。

以下是一个PHP示例代码,演示了如何执行这些操作。为了进行Base32解码,我们将使用一个常见的PHP Base32库(例如 StephenHill\Base32,您需要通过Composer安装它)。

<?php

// 假设您已经通过Composer安装了StephenHill\Base32库
// require 'vendor/autoload.php';

// 如果没有使用Composer,或者想手动引入,可以参考以下简化版Base32解码函数
// 注意:以下Base32解码函数仅为示例,可能不具备生产环境的健壮性
// 推荐使用成熟的库,如 StephenHill\Base32
class Base32
{
    private static $map = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';

    public static function decode(string $input): string
    {
        $input = strtoupper($input);
        $paddingChar = '=';
        if (strpos($input, $paddingChar) !== false) {
            $input = substr($input, 0, strpos($input, $paddingChar));
        }

        $bitBuffer = 0;
        $bitCount = 0;
        $output = '';

        for ($i = 0; $i < strlen($input); $i++) {
            $char = $input[$i];
            $val = strpos(self::$map, $char);

            if ($val === false) {
                // Invalid character, handle error or skip
                continue;
            }

            $bitBuffer = ($bitBuffer << 5) | $val;
            $bitCount += 5;

            while ($bitCount >= 8) {
                $bitCount -= 8;
                $output .= chr(($bitBuffer >> $bitCount) & 0xFF);
            }
        }
        return $output;
    }
}


/**
 * 解析v3 Tor洋葱地址,提取公钥、校验和与版本号。
 *
 * @param string $onionAddress 完整的v3洋葱地址,例如 "pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion"
 * @return array|null 包含 'publicKey', 'checksum', 'version' 的关联数组,或解析失败返回 null
 */
function parseV3OnionAddress(string $onionAddress): ?array
{
    // 1. 移除 .onion 后缀
    if (!str_ends_with($onionAddress, '.onion')) {
        echo "错误: 无效的洋葱地址格式,缺少 '.onion' 后缀。\n";
        return null;
    }
    $base32Encoded = str_replace(".onion", "", $onionAddress);

    // 2. Base32 解码
    // 使用 StephenHill\Base32 库
    // $decodedBytes = \StephenHill\Base32::decode($base32Encoded);
    // 使用上面提供的简化版Base32类
    $decodedBytes = Base32::decode($base32Encoded);


    // v3洋葱地址解码后应为35字节
    if (strlen($decodedBytes) !== 35) {
        echo "错误: Base32解码后的长度不符合v3洋葱地址规范 (期望35字节,实际 " . strlen($decodedBytes) . " 字节)。\n";
        return null;
    }

    // 3. 提取组件
    // PUBKEY 是前32字节
    $publicKey = substr($decodedBytes, 0, 32);

    // CHECKSUM 是接下来的2字节 (即第33和34字节,0-indexed)
    $checksum = substr($decodedBytes, 32, 2);

    // VERSION 是最后1字节 (即第35字节,0-indexed)
    $version = substr($decodedBytes, 34, 1);

    return [
        'publicKey' => bin2hex($publicKey), // 通常以十六进制表示
        'checksum' => bin2hex($checksum),   // 通常以十六进制表示
        'version' => ord($version)          // 版本号通常是整数
    ];
}

// 示例使用
$onionUrl = "pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion";
$parsedData = parseV3OnionAddress($onionUrl);

if ($parsedData) {
    echo "解析成功!\n";
    echo "公钥 (hex): " . $parsedData['publicKey'] . "\n";
    echo "校验和 (hex): " . $parsedData['checksum'] . "\n";
    echo "版本号: " . $parsedData['version'] . "\n";

    // 验证版本号是否为3
    if ($parsedData['version'] === 3) {
        echo "版本号符合v3规范 (3)。\n";
    } else {
        echo "警告: 版本号不为3,可能不是标准的v3洋葱地址。\n";
    }
}

// 另一个示例
$onionUrl2 = "sp3k262uwy4r2k3ycr5awluarykdpag6a7y33jxop4cs2lu5uz5sseqd.onion";
$parsedData2 = parseV3OnionAddress($onionUrl2);
if ($parsedData2) {
    echo "\n--- 第二个地址解析 ---\n";
    echo "公钥 (hex): " . $parsedData2['publicKey'] . "\n";
    echo "校验和 (hex): " . $parsedData2['checksum'] . "\n";
    echo "版本号: " . $parsedData2['version'] . "\n";
}

?>

代码解释:

  • str_ends_with() 用于检查字符串是否以特定后缀结尾,是PHP 8+ 的函数。如果使用旧版本PHP,可以替换为 substr($onionAddress, -6) === '.onion'。
  • str_replace(".onion", "", $onionAddress) 移除了后缀。
  • Base32::decode($base32Encoded) 执行Base32解码。这里为了演示,提供了一个简化的 Base32 类,但在实际生产环境中,强烈建议使用经过充分测试和维护的第三方库,例如 StephenHill\Base32。
  • substr($decodedBytes, offset, length) 函数用于从二进制字符串中提取指定长度的子字符串。
    • substr($decodedBytes, 0, 32) 提取前32字节作为公钥。
    • substr($decodedBytes, 32, 2) 提取接下来的2字节作为校验和。
    • substr($decodedBytes, 34, 1) 提取最后1字节作为版本号。
  • bin2hex() 将二进制字符串转换为十六进制表示,这在显示公钥和校验和时非常有用,因为它们通常以十六进制格式呈现。
  • ord() 将单字节字符转换为其ASCII值,对于版本号 \x03,它会返回整数 3。

注意事项与总结

  1. Base32解码库: 务必使用一个可靠且经过测试的Base32解码库。本文提供的简化版仅用于说明原理,不建议直接用于生产环境。
  2. 二进制字符串处理: PHP在处理字符串时,需要注意其是否为二进制安全。substr()、strlen() 等函数在处理二进制数据时是安全的。
  3. 校验和验证: 为了进一步验证洋葱地址的有效性,您可以根据Tor规范重新计算校验和,并与提取出的校验和进行比较。如果两者不匹配,则表明洋葱地址可能被篡改或无效。校验和的计算需要用到哈希函数(如SHA3),以及原始的公钥和版本号。
  4. 错误处理: 在实际应用中,应增加更完善的错误处理机制,例如捕获Base32解码失败、地址格式不正确等情况。

通过上述步骤和PHP代码示例,您现在应该能够程序化地解析v3版Tor洋葱地址,并从中提取出其核心组成部分。这对于开发与Tor隐藏服务相关的工具或进行数据分析非常有用。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

相关专题

更多
composer是什么插件
composer是什么插件

Composer是一个PHP的依赖管理工具,它可以帮助开发者在PHP项目中管理和安装依赖的库文件。Composer通过一个中央化的存储库来管理所有的依赖库文件,这个存储库包含了各种可用的依赖库的信息和版本信息。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

304

2023.12.25

Composer 安装与快速入门指南
Composer 安装与快速入门指南

面向 PHP 开发新手,详细介绍 Composer 的下载安装方式(本地安装与全局安装)、国内镜像源(阿里云/腾讯云)加速配置、composer.json 与 composer.lock 文件的作用解析、require/install/update 等核心命令的使用方法,帮助开发者快速掌握 PHP 依赖管理的基本工作流。

463

2026.04.10

Composer 依赖管理与版本控制实战
Composer 依赖管理与版本控制实战

深入讲解 Composer 的依赖管理机制,涵盖语义化版本号规范、版本约束符(^、~、*、>=)的区别与最佳实践、composer.lock 在团队协作中的锁定策略、依赖冲突的排查与解决方法、require-dev 与生产依赖的分离管理、平台依赖检查(platform-check)等进阶内容,帮助开发者在项目中精准控制依赖版本、避免"依赖地狱"。

267

2026.04.10

Composer 自定义包开发与发布教程合集
Composer 自定义包开发与发布教程合集

以实际项目为导向,讲解如何从零创建一个符合规范的 Composer 包,涵盖 composer.json 元信息配置、PSR-4 自动加载规则设置、命名空间规划、单元测试集成、README 与 LICENSE 编写规范,以及将包提交到 Packagist 公共仓库或搭建 Satis/Private Packagist 私有仓库的完整发布流程,帮助开发者将可复用代码封装为标准化的 Composer 包。

269

2026.04.10

Composer 自动加载机制与性能优化
Composer 自动加载机制与性能优化

系统剖析 Composer 的自动加载体系,讲解 PSR-0 与 PSR-4 自动加载标准的区别与演进、classmap 与 files 加载方式的适用场景、autoload_real.php 源码级加载流程解析,同时介绍 composer dump-autoload -o 优化加载映射、APCu 缓存加速、authoritative-classmap 配置等生产环境性能优化手段,帮助开发者深入理解自动加载原理并提升项目启动速度。

240

2026.04.13

Composer 在主流 PHP 框架中的应用实践
Composer 在主流 PHP 框架中的应用实践

结合 Laravel、ThinkPHP、Symfony 等主流 PHP 框架的实际场景,讲解 Composer 在框架项目中的典型应用,包括通过 create-project 初始化框架项目、安装与管理第三方扩展包、scripts 钩子(post-install/post-update)自动执行部署任务、自定义 Installer 插件开发、多项目共享 vendor 依赖的 Monorepo 工作流管理,帮助开发者在真实框架项目中充分发

303

2026.04.13

Composer 镜像源配置与网络问题排查
Composer 镜像源配置与网络问题排查

针对国内开发者常遇到的 Composer 网络问题,详细讲解阿里云、腾讯云、华为云等国内镜像源的全局与项目级切换方法、多镜像源优先级配置策略、composer config 命令行快速设置技巧,同时涵盖 SSL 证书错误、连接超时、下载中断等常见网络报错的排查与修复方案,以及利用 artifact / path 仓库实现完全离线环境下的依赖安装。

151

2026.04.14

Composer Scripts 脚本与自动化工作流
Composer Scripts 脚本与自动化工作流

系统讲解 Composer Scripts 机制的完整用法,涵盖 pre-install、post-update、post-autoload-dump 等内置事件钩子的触发时机与应用场景、自定义脚本命令的定义与参数传递、调用外部 Shell 命令与 PHP 静态方法、多脚本串联执行与条件判断,以及结合代码检查(PHPStan/PHP-CS-Fixer)、数据库迁移、缓存清理等任务构建一键部署自动化工作流。

210

2026.04.14

Conan私有仓库搭建教程
Conan私有仓库搭建教程

本专题系统的讲解Conan私有仓库的搭建流程,涵盖仓库服务部署、存储目录配置、用户认证、权限划分和远程地址添加,并介绍内部C++依赖包的上传、下载及版本维护方法。

0

2026.09.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn