V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
iqoo
V2EX  ›  分享创造

使用域名存储任意二进制数据

  •  
  •   iqoo · 9 小时 18 分钟前 · 920 次点击

    花两小时写了个小玩具~ 将任意数据编码成 0123456789abcdefghijklmnopqrstuvwxyz-_. 这 39 种字符,从而可使用泛域名作为数据载荷。

    演示:

    https://webtun.net

    测试 1:

    https://ieexilte62qr8gi_3y76.webtun.net

    测试 2:

    http://kdogjdmfpm9p7.6d5zsei2npvtpih.tk79f4585ks94nxxo9ajk27bna85p3z4w29wa43jrivwdner9cq7nddhedeipqm.zor5dvt35zb04is4sl361pcsefqbhujln3brpwangxm.5.a14v59vq8zp-s49_s7t7-a5jhy_3m2bj9zlgd8od.m0.j7avjurm6.p5wvkbfwlflo-4_l44zavnycho6p3y0vvu3056nm0140h1da.webtun.net

    测试 3:

    http://vhrxs88.aonmd_1j53i6tv6lb.s.rzkobvrsrhmcxh9s4oscdwl5pmv8jznshsgmy1japb045wxz2kh1zqwqyuwaab1.3nap.wfes65.utd--5s3.webtun.net

    测试 4:

    http://eqh9ah1obms5ofl-v0r92s8-469-z53dbz1w3goa2zgnjmsupxkrnfn1r.eu2.7am27y1bferkctlc964qi8g88stn8u5c04pcyc1lf4wcf9kpt511dwa748lkxhy.gmn3d6ctm5msuas7utal8_5h_we5y-oc_gq6fm6icwwjpo6haa481mjlacoy3_.k19.webtun.net

    由于域名每段长度必须大于 0 小于 64 ,因此边界位置不能使用点号,只能使用剩余的 38 个字符,因此总体编码率略低于 Base39 。

    当然这个域名不够短,本来还可以再多存储几个字节的信息。不过短域名比较贵,暂时不折腾。

    另外 HTTPS 也是个麻烦事,目前只给一级域名用上证书,其他的仍然是 HTTP 。

    第 1 条附言  ·  7 小时 31 分钟前
    这个算法是针对通用二进制数据的,用字符串只是方便演示,其实并不划算。字符串用 punycode 编码效果更好~
    第 2 条附言  ·  5 小时 42 分钟前
    这个方案有实际应用意义的玩法是端口敲门,可以参考: https://github.com/EtherDream/js-port-knocking?tab=readme-ov-file#udpdns-%E7%9B%B4%E6%8E%A5%E6%95%B2%E9%97%A8
    19 条回复    2024-09-20 04:04:26 +08:00
    a1210968738
        1
    a1210968738  
       8 小时 58 分钟前 via Android
    多级泛域名解析有哪个服务商支持呢? cloudflare 有吗?
    totoro625
        2
    totoro625  
       8 小时 46 分钟前
    @a1210968738 #1 *.域名 默认匹配 *.*.*.域名

    PS:我以为是域名的 txt 解析存储数据了
    sc13
        3
    sc13  
       8 小时 41 分钟前
    这个主要是用来解决什么问题
    gaojiren
        4
    gaojiren  
       8 小时 39 分钟前
    打不开,过了一会打卡了,不知道是不是解析问题
    hefish
        5
    hefish  
       8 小时 35 分钟前
    应该像三体人那样,找把尺,然后在尺子上某个地方划一刀。。。就把地球所有科技都包含了。。。
    然后三体人带着这把尺,回到三体星, 找个一个精密的仪器一测,发现划的地方是 整个尺的 0.12331958i209483098089349800293078485040348u509345021989834798237409872181437809802347089123741098237409182734091872340985943653....

    然后把小数点后面的数字 decode 一下, 发现原来是维基百科的离线版。。。。超方便。。。
    rekulas
        6
    rekulas  
       8 小时 3 分钟前
    你都用域名了,为啥不用 url param, 能支持的长度远大于域名

    这种还是有一些使用场景的(虽然不多) 例如你有个 5kb 的 zip 需要存储, 可以保存到不支持附件的任何文本笔记里,打开链接即可下载
    meeop
        7
    meeop  
       8 小时 0 分钟前
    是不是我理解不对,感觉逻辑有点像太阳能手电筒

    1 既然我都能拿到完整 url 了,那我直接解码就行了,何必还要打开 url 呢?
    http://eqh9ah1obms5ofl-v0r92s8-469-z53dbz1w3goa2zgnjmsupxkrnfn1r.eu2.7am27y1bferkctlc964qi8g88stn8u5c04pcyc1lf4wcf9kpt511dwa748lkxhy.gmn3d6ctm5msuas7utal8_5h_we5y-oc_gq6fm6icwwjpo6haa481mjlacoy3_.k19.webtun.net

    2 编码的 base39 比原文长,那直接用原文作为域名不是更直白高效?
    比如 你好呀.webtun.net
    iqoo
        8
    iqoo  
    OP
       7 小时 43 分钟前
    @meeop 你好呀 => xn--6qqs2j68e
    iqoo
        9
    iqoo  
    OP
       7 小时 41 分钟前
    @rekulas 纯属好玩而已,根本纯不了 5kb ,最多只有 160 多字节。不支持附件的论坛用 URL 最简单~
    kenvix
        10
    kenvix  
       7 小时 19 分钟前   ❤️ 1
    不是,这个需求你为啥不用 TXT 记录啊。我一般就直接用 TXT 记录实现软件版本更新检测
    jim9606
        11
    jim9606  
       7 小时 18 分钟前
    都有域名和服务器了,托管小数据不是什么难事。
    想一毛不拔的方法其实也有。
    yanyao233
        12
    yanyao233  
       7 小时 10 分钟前 via Android
    @kenvix 用 txt 记录版本号这思路挺好,学到了~
    ssh
        13
    ssh  
       6 小时 51 分钟前
    然后再搞个返回 data via ipv6
    基于 dns 服务器的数据传输?
    a1210968738
        14
    a1210968738  
       6 小时 47 分钟前 via Android
    @totoro625 试了下确实可以,不过 https 证书是不是只可以匹配*.域名,无法申请匹配 *.*.*.域名之类的多级泛域名证书?
    我看你的例子里也是多级域名就用 HTTP 了…
    Greatshu
        15
    Greatshu  
       6 小时 13 分钟前
    像是搞黑产的,再配合 DGA 域名……
    Lightbright
        16
    Lightbright  
       6 小时 2 分钟前 via Android
    @Greatshu 哈哈,赞同
    iqoo
        17
    iqoo  
    OP
       5 小时 46 分钟前
    @kenvix 浏览器环境,拿不到 TXT 返回值。这个方案最早是用于 web 端口敲门的,js 无状态给服务器发少量信息。
    neilp
        18
    neilp  
       5 小时 39 分钟前
    为啥要用子域名, 为啥不直接写在 path 里面: https://webrun.net/ieexilte62qr8gi_3y76

    正如楼上所说, 这是个手电筒的问题. 既然我已经知道数据了, 为什么还要去访问? 这个意义是什么.
    cdlnls
        19
    cdlnls  
       1 小时 35 分钟前 via Android
    其实是有使用场景的。

    当你需要秘密传输数据的时候,就可以利用这个方法。

    首先自己建一个 dns 服务器,把域名的 NS 记录指向自建的服务器。

    然后要发送数据的时候,把数据解析用你的方法解析成域名,然后程序执行 DNS 查询。

    在经过各种 DNS 服务器层层递归转发之后,最终这个解析会被你的自建 DNS 捕捉到,这样就可以根据域名拿到数据。

    就可以在神不知鬼不觉的情况下,偷偷的将信息传递出去
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   963 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 735ms · UTC 21:40 · PVG 05:40 · LAX 14:40 · JFK 17:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.