导读:本期聚焦于小伙伴创作的《如何用PHP解析v3 Onion域名提取公钥与校验和信息?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何用PHP解析v3 Onion域名提取公钥与校验和信息?》有用,将其分享出去将是对创作者最好的鼓励。

PHP解析 v3 Onion 域名:提取公钥、校验和与版本信息

在暗网相关的开发场景中,v3版本Onion域名(即Tor网络的隐藏服务地址)的解析需求十分常见。v3 Onion域名本质上是一段经过Base32编码的字符串,其中包含了服务的公钥、校验和以及版本标识等核心信息。本文将介绍如何使用PHP解析v3 Onion域名,从中提取这些关键字段。

v3 Onion域名的结构说明

标准的v3 Onion域名格式为:公钥(52字符) + 校验和(2字符) + 版本标识(1字符) + .onion,总长度固定为56字符(不含.onion后缀)。各部分的含义如下:

  • 公钥部分:前52位Base32编码字符,对应服务的Ed25519公钥,是身份标识的核心
  • 校验和部分:接下来2位Base32编码字符,用于验证公钥部分的完整性
  • 版本标识:最后1位Base32编码字符,v3版本固定为字符"3",用于区分不同版本的Onion协议

PHP解析实现步骤

解析过程主要分为三步:验证域名格式合法性、拆分各部分字段、进行Base32解码提取原始信息。下面是完整的实现代码:

<?php
/**
 * 解析v3 Onion域名,提取公钥、校验和、版本信息
 * @param string $onionDomain 待解析的v3 Onion域名,例如 abcdefghijklmnopqrstuvwxyz234567abcdefghijklmnopqrstuvwxyz234567.onion
 * @return array|false 解析成功返回包含各字段的数组,失败返回false
 */
function parseV3OnionDomain(string $onionDomain)
{
    // 第一步:去除.onion后缀,统一转为小写处理
    $cleanDomain = strtolower(rtrim($onionDomain, '.onion'));
    
    // 第二步:验证域名长度,v3 Onion不带后缀固定为56字符
    if (strlen($cleanDomain) !== 56) {
        return false;
    }
    
    // 第三步:验证字符是否符合Base32规范(仅包含A-Z、2-7)
    if (!preg_match('/^[a-z2-7]{56}$/', $cleanDomain)) {
        return false;
    }
    
    // 第四步:拆分各部分字段
    $publicKeyBase32 = substr($cleanDomain, 0, 52); // 公钥部分,52字符
    $checksumBase32 = substr($cleanDomain, 52, 2);  // 校验和部分,2字符
    $versionBase32 = substr($cleanDomain, 54, 1);   // 版本部分,1字符
    
    // 第五步:Base32解码(PHP无内置Base32解码,需自定义实现)
    $publicKeyRaw = base32Decode($publicKeyBase32);
    $checksumRaw = base32Decode($checksumBase32);
    $versionRaw = base32Decode($versionBase32);
    
    // 第六步:验证版本是否为v3(解码后应为字符"3")
    $version = '';
    if ($versionRaw !== false) {
        $version = ord($versionRaw) === 3 ? '3' : '未知版本';
    }
    
    return [
        'raw_domain' => $cleanDomain . '.onion',
        'public_key_base32' => $publicKeyBase32,
        'public_key_raw' => $publicKeyRaw !== false ? bin2hex($publicKeyRaw) : '解码失败',
        'checksum_base32' => $checksumBase32,
        'checksum_raw' => $checksumRaw !== false ? bin2hex($checksumRaw) : '解码失败',
        'version' => $version
    ];
}

/**
 * Base32解码实现(符合RFC 4648规范)
 * @param string $input Base32编码字符串
 * @return string|false 解码后的原始二进制数据,失败返回false
 */
function base32Decode(string $input)
{
    $base32Chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';
    $input = strtoupper($input);
    $output = '';
    $buffer = 0;
    $bitsLeft = 0;
    
    for ($i = 0; $i < strlen($input); $i++) {
        $char = $input[$i];
        $charPos = strpos($base32Chars, $char);
        if ($charPos === false) {
            return false; // 非法字符
        }
        $buffer = ($buffer << 5) | $charPos;
        $bitsLeft += 5;
        
        if ($bitsLeft >= 8) {
            $bitsLeft -= 8;
            $output .= chr(($buffer >> $bitsLeft) & 0xFF);
            $buffer &= (1 << $bitsLeft) - 1;
        }
    }
    
    // 处理末尾填充(如果存在)
    if ($bitsLeft > 0) {
        $buffer <<= (8 - $bitsLeft);
        $output .= chr($buffer & 0xFF);
    }
    
    return $output;
}

// 测试示例
$testOnion = 'abcdefghijklmnopqrstuvwxyz234567abcdefghijklmnopqrstuvwxyz234567.onion';
$result = parseV3OnionDomain($testOnion);

if ($result !== false) {
    echo "解析结果:\n";
    foreach ($result as $key => $value) {
        echo "$key: $value\n";
    }
} else {
    echo "域名格式非法,解析失败\n";
}
?>

代码说明

上述代码首先实现了parseV3OnionDomain函数,负责整体的解析逻辑:先对输入域名做格式校验,确保符合v3 Onion的长度和字符规范,再按长度拆分出公钥、校验和、版本三个部分,最后调用自定义的base32Decode函数对Base32编码的内容做解码,将二进制数据转为十六进制字符串方便查看。

其中base32Decode函数遵循RFC 4648的Base32解码规范,先建立Base32字符到索引的映射,再逐位处理输入字符,拼接二进制缓冲区后按8位拆分输出原始数据。需要注意的是,解码后的公钥和校验和是二进制格式,通常我们会将其转为十六进制字符串存储或展示,避免乱码问题。

注意事项

  • v3 Onion域名的字符仅包含A-Z(不区分大小写)和数字2-7,解析前做字符校验可以避免无效输入导致的错误
  • 校验和字段的作用是验证公钥部分的完整性,实际业务中如果需要做完整性校验,可以按照Tor的规范计算公钥的SHA3哈希后取前2字节做Base32编码,与解析出的校验和做比对
  • 版本标识仅v3版本为"3",如果出现其他值,说明域名不符合v3规范,可能是旧版本或其他类型的地址

PHP解析Onion域名v3_Onion结构Base32解码Tor隐藏服务公钥提取

免责声明:已尽一切努力确保本网站所含信息的准确性。网站部分内容来源于网络或由用户自行发表,内容观点不代表本站立场。本站是个人网站免费分享,内容仅供个人学习、研究或参考使用,如内容中引用了第三方作品,其版权归原作者所有。若内容触犯了您的权益,请联系我们进行处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。前端、网络、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握网站开发与运维所需的核心技术栈。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端逻辑,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。