V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
AloneHero
V2EX  ›  程序员

如何对图片加密使其避免被网盘屏蔽

  •  1
     
  •   AloneHero · 2022-05-14 10:20:39 +08:00 via Android · 6800 次点击
    这是一个创建于 916 天前的主题,其中的信息可能已经有所发展或是发生改变。

    先说需求,我想把图片传到网盘上,再在自己的页面上通过请求网盘 api 来浏览图片,这里面会有解密图片数据的机会。

    现在问题在于,我怎么样能最简单的加密图片来保证不会被网盘屏蔽?

    现在初步的想法是对图片数据每一位异或 1 处理,只是不知道这种简单的处理方式 AI 能不能检测出来,希望有了解这方面的大佬指点一下。

    另外大家有没有什么简单高性能又可靠的图片加密方案呢?

    44 条回复    2022-05-16 10:41:34 +08:00
    XiLingHost
        1
    XiLingHost  
       2022-05-14 10:21:26 +08:00
    base64 内容,改后缀
    AloneHero
        2
    AloneHero  
    OP
       2022-05-14 10:24:53 +08:00 via Android
    @XiLingHost base64 不行,体积整体要膨胀 1/3 ,而且浏览器解码后体积膨胀更大,遇到大图估计会卡
    XiLingHost
        3
    XiLingHost  
       2022-05-14 10:32:21 +08:00
    @AloneHero 那试试 AES ,现在有硬件加速 AES 的速度已经不错了
    webshe11
        4
    webshe11  
       2022-05-14 10:35:34 +08:00
    异或起码搞个密钥,循环异或
    lishoujun
        5
    lishoujun  
       2022-05-14 10:58:19 +08:00
    我看刑。
    带密码压缩一下呢?让客户端解压一下。
    okakuyang
        6
    okakuyang  
       2022-05-14 11:11:41 +08:00
    转 avif 或许就行了
    XiLingHost
        7
    XiLingHost  
       2022-05-14 11:15:24 +08:00
    其实我建议使用 base64 的一个考虑是,前端本身是支持直接使用 base64 作为图片的 blob 内容的,这样需要的额外处理是最少的
    privapps
        8
    privapps  
       2022-05-14 11:19:44 +08:00
    vvhhaaattt
        9
    vvhhaaattt  
       2022-05-14 11:24:51 +08:00 via Android
    encfs
    vvhhaaattt
        10
    vvhhaaattt  
       2022-05-14 11:25:58 +08:00 via Android
    @vvhhaaattt 没注意到是要网页用的
    zengxs
        11
    zengxs  
       2022-05-14 12:10:04 +08:00
    最不折腾的方案:换个图床,别用网盘
    porrat
        12
    porrat  
       2022-05-14 12:16:42 +08:00
    简单的 XOR 就行,用 AES 也行,现代处理器都支持硬件 AES 速度非常快
    phpfpm
        13
    phpfpm  
       2022-05-14 12:24:29 +08:00   ❤️ 3
    我觉得你这个是伪需求

    网盘就不是给前端用的,你用,就是盗图

    你偷就偷吧,还让别人不知道你存了什么

    太鸡贼了
    Laforet
        14
    Laforet  
       2022-05-14 12:25:47 +08:00 via Android
    Base64
    Laforet
        15
    Laforet  
       2022-05-14 12:27:35 +08:00 via Android
    Base64 再用固定密钥 XOR 最简单,传输过程中有 gzip 的话文件大小其实不会增加多少,客户端开销是绕不开的。如果对性能要求很高那可以自己写一个 decoder 然后把解压放在 js 层面完成,但是感觉有点本末倒置。
    Tanix2
        16
    Tanix2  
       2022-05-14 12:50:00 +08:00
    放到压缩包里加个密码行吗
    nicevar
        17
    nicevar  
       2022-05-14 12:52:38 +08:00
    一个很简单的办法,就是读取前面一部分字节进行简单加密,然后把信息写入尾部,解密的时候再读取出来补上就行了,视频和图片我都这样做过
    XiLingHost
        18
    XiLingHost  
       2022-05-14 12:56:16 +08:00
    我的建议是就保存成纯文本的 base64 ,前端不要做任何计算,把它填充到<img src="data:image/png;base64, {base64_data} />里面让浏览器帮你展示
    kirory
        19
    kirory  
       2022-05-14 13:59:19 +08:00
    用一个序列对每一位异或。
    可以简单的使用 0-255 ,还能更改起始的 seed 。
    虽然容易破解,但用在这里足够了
    PeterD
        20
    PeterD  
       2022-05-14 14:09:48 +08:00
    用 BaiduPCS-Py 或 AliPCS-Py ,自动加密上传,再开一个 http server ,自动给你解密。
    xiangyuecn
        21
    xiangyuecn  
       2022-05-14 14:14:19 +08:00   ❤️ 10
    不要当帮凶,他要传黄图
    dingdangnao
        22
    dingdangnao  
       2022-05-14 14:14:39 +08:00
    OSS COS 不行?一定要网盘?
    ttionya
        23
    ttionya  
       2022-05-14 14:16:44 +08:00   ❤️ 1
    正好最近我也有这样的想法,想法比较幼稚,可以参考。

    识别图片等信息是靠前 X bit 和最后 X bit ,我只要在图片前面和后面插入固定长度的随机字符串就行了,然后解密可以直接在前端做,也可以在后端做。

    前端比较简单,可以参考

    ```js
    xhr=new XMLHttpRequest()
    xhr.open('GET', 'https://example.com/a.jpg')
    xhr.responseType = 'blob'
    xhr.onload = function(e) {
    console.log(this.response)
    const newBlob = this.response.slice(64, this.response.size, this.response.type)
    console.log(newBlob)

    document.getElementById('image').src=URL.createObjectURL(newBlob)
    }
    xhr.send()
    ```
    Ultraman
        24
    Ultraman  
       2022-05-14 14:17:23 +08:00 via Android   ❤️ 3
    @xiangyuecn 我劝你少管闲事(狗头.jpg )
    allanpk716
        25
    allanpk716  
       2022-05-14 15:31:24 +08:00 via iPhone
    之前在微博有人做过,思路是直接把图片 N 块切开,上传发微博。然后正确组合的 index 只有你知道,做 js 插件去还原图片。大概是这个思路啊,细节记不住了。
    galenzhao
        26
    galenzhao  
       2022-05-14 15:49:31 +08:00 via iPhone
    encfs
    SunsetShimmer
        27
    SunsetShimmer  
       2022-05-14 17:30:43 +08:00
    有哪个网盘有 API 还允许跨域调用和加载文件的啊。。。?
    (我记得 sharepoint 好像是这样?)
    dingwen07
        28
    dingwen07  
       2022-05-14 18:01:09 +08:00 via iPhone
    CBC 一下
    jim9606
        29
    jim9606  
       2022-05-14 18:12:20 +08:00
    哪家网盘会允许你当图床用甚至还给可以浏览器跨域使用的 api ?
    直接基于二进制流的加密(xor ,aes)要求原图未经有损处理。
    我 i 觉得 @allanpk716 说的那个思路可以,将图片切成 MxN 的块,按一个预先指定的映射打乱块的位置,同时每一个块的 U/V 通道做一个无损变换。呈现时用 js 通过 canvas 恢复。这个方法能抵御缩放但可能抵御不了 JPEG 的 DCT 压缩。
    tutudou
        30
    tutudou  
       2022-05-14 18:43:28 +08:00
    直接把所有的字节+1 即可
    for i in range(len(read_bytes)):
    if read_bytes[i] == 0:
    read_bytes[i] = 255
    else:
    read_bytes[i] = read_bytes[i] - 1
    haah
        31
    haah  
       2022-05-14 18:56:10 +08:00
    网盘为啥要屏蔽图片?
    phpfpm
        32
    phpfpm  
       2022-05-14 19:41:17 +08:00
    @haah 题主要搞皇瑟
    散了吧
    winglight2016
        33
    winglight2016  
       2022-05-14 19:43:13 +08:00
    对抗这种检测 AI 其实挺简单,按一定规则在图片中插值,不但能防 AI 检测,还能用肉眼看不出来图片改变——也就是说,你的客户端不需要做任何处理
    AloneHero
        34
    AloneHero  
    OP
       2022-05-14 20:09:24 +08:00 via Android
    @okakuyang 转 avif 不是很稳,网盘可能检测到也可能检测不到,而且一些图片格式转 avif 如果质量系数低转完太糊,质量系数高体积会膨胀,得不偿失。
    @lishoujun 客户端解压还要引入包有点麻烦
    @Tanix2
    @allanpk716 切图思路确实新奇,不过有点隐患,切的太少仍然容易被识别,切的太多客户端网络并发高,容易阻塞
    @SunsetShimmer @jim9606 只是个人用而已,可以在访问官方页面时代理到自己的页面,自己的页面注册上 service worker ,就能实现永久劫持官方页面。
    haah
        35
    haah  
       2022-05-14 21:21:50 +08:00
    1 、Base64 写到页面里;
    2 、颜色分离:透明 /黑白 /彩色。
    haah
        36
    haah  
       2022-05-14 21:25:07 +08:00
    加密涉及到密钥交换问题,你的场景不适用!
    lawler
        37
    lawler  
       2022-05-14 21:36:05 +08:00
    @allanpk716 #25 这是技术方案。非技术的女孩们用三合一上传新浪。哈哈哈哈哈
    Greatshu
        38
    Greatshu  
       2022-05-14 22:11:05 +08:00   ❤️ 2
    图片切成 9 或更多块,打乱重组成一张新图,前端还原
    CharlesGray
        39
    CharlesGray  
       2022-05-14 22:24:13 +08:00
    openssl aes-256-cbc -md sha3-512 -pbkdf2 -iter 114514 -salt -in inputfile -out outputfile
    应该是最安全的加密之一了
    CharlesGray
        40
    CharlesGray  
       2022-05-14 22:24:41 +08:00
    @CharlesGray 而且还不会增长文件体积,加密前后大小一样的,aes 速度也很快
    djyde
        41
    djyde  
       2022-05-14 23:09:33 +08:00
    Aloento
        42
    Aloento  
       2022-05-16 00:16:26 +08:00 via Android
    离谱的需求,建议重新考虑
    tsanie
        43
    tsanie  
       2022-05-16 09:36:50 +08:00
    @AloneHero 不是切成多个碎块文件,是 M*N 切块打乱顺序后重新画到一张图上(这样图片看起来就像马赛克一样),客户端下下来再重新切换还原顺序绘制。
    hatsuyuki
        44
    hatsuyuki  
       2022-05-16 10:41:34 +08:00
    @tsanie 很多漫画网站的 DRM 保护都用的这种方法,切块打乱顺序返回,前端排序后 canvas 绘制
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5493 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 06:55 · PVG 14:55 · LAX 22:55 · JFK 01:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.