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

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

  •  1
     
  •   iqoo · 94 天前 · 3092 次点击
    这是一个创建于 94 天前的主题,其中的信息可能已经有所发展或是发生改变。

    花两小时写了个小玩具~ 将任意数据编码成 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 条附言  ·  93 天前
    这个算法是针对通用二进制数据的,用字符串只是方便演示,其实并不划算。字符串用 punycode 编码效果更好~
    第 2 条附言  ·  93 天前
    这个方案有实际应用意义的玩法是端口敲门,可以参考: https://github.com/EtherDream/js-port-knocking?tab=readme-ov-file#udpdns-%E7%9B%B4%E6%8E%A5%E6%95%B2%E9%97%A8
    30 条回复    2024-11-07 14:10:26 +08:00
    a1210968738
        1
    a1210968738  
       94 天前 via Android
    多级泛域名解析有哪个服务商支持呢? cloudflare 有吗?
    totoro625
        2
    totoro625  
       94 天前
    @a1210968738 #1 *.域名 默认匹配 *.*.*.域名

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

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

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

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

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

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

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

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

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

    就可以在神不知鬼不觉的情况下,偷偷的将信息传递出去
    shilyx
        20
    shilyx  
       93 天前
    唉 一块净土又被你们盯上了,这么干很快就会废

    要么限制子域名数量,要么限制长度
    gaobh
        21
    gaobh  
       93 天前
    已经有二维码存储二进制文件了,好像是在 github 上,利好灰产
    baobao1270
        22
    baobao1270  
       93 天前 via Android   ❤️ 1
    终于遇到这个和我一样想法的人了
    这个技术最合适的应用是侧信道攻击
    把想要偷偷发送的数据通过域名编码,发起 DNS 查询
    然后通过 DNS Log 接收数据
    ShinichiYao
        23
    ShinichiYao  
       93 天前
    昨天刚看到一个可以把 30M 以内文件编码成二维码的工具
    BadReese
        24
    BadReese  
       93 天前
    这个还真是很有意思
    chenxuuu
        25
    chenxuuu  
       93 天前
    https 问题可以用泛域名证书解决,或者直接挂到 cf 得了,不用管可省事
    smartiscool
        26
    smartiscool  
       93 天前
    DGA 检测分析,现在任何一个正规的网安产品都能检测出来,不要拿来做坏事哦
    enderftt
        27
    enderftt  
       93 天前
    @ShinichiYao #23 啥工具 还找得到么
    ob
        28
    ob  
       93 天前 via Android
    @ShinichiYao 很怀疑啥工具能让二维码存这个数量?方便共享吗?
    LoreLiu
        30
    LoreLiu  
       45 天前
    @a1210968738 #14 印象中证书不能匹配多级子域名,对于 cloudflare 的边缘证书 *.domain 只能匹配 sub.domain
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2907 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:50 · PVG 21:50 · LAX 05:50 · JFK 08:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.