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

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

  •  1
     
  •   AloneHero · 14 天前 via Android · 4925 次点击

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

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

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

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

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

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

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

    太鸡贼了
    Laforet
        14
    Laforet  
       14 天前 via Android
    Base64
    Laforet
        15
    Laforet  
       14 天前 via Android
    Base64 再用固定密钥 XOR 最简单,传输过程中有 gzip 的话文件大小其实不会增加多少,客户端开销是绕不开的。如果对性能要求很高那可以自己写一个 decoder 然后把解压放在 js 层面完成,但是感觉有点本末倒置。
    Tanix2
        16
    Tanix2  
       14 天前
    放到压缩包里加个密码行吗
    nicevar
        17
    nicevar  
       14 天前
    一个很简单的办法,就是读取前面一部分字节进行简单加密,然后把信息写入尾部,解密的时候再读取出来补上就行了,视频和图片我都这样做过
    XiLingHost
        18
    XiLingHost  
       14 天前
    我的建议是就保存成纯文本的 base64 ,前端不要做任何计算,把它填充到<img src="data:image/png;base64, {base64_data} />里面让浏览器帮你展示
    kirory
        19
    kirory  
       14 天前
    用一个序列对每一位异或。
    可以简单的使用 0-255 ,还能更改起始的 seed 。
    虽然容易破解,但用在这里足够了
    PeterD
        20
    PeterD  
       14 天前
    用 BaiduPCS-Py 或 AliPCS-Py ,自动加密上传,再开一个 http server ,自动给你解密。
    xiangyuecn
        21
    xiangyuecn  
       14 天前   ❤️ 10
    不要当帮凶,他要传黄图
    dingdangnao
        22
    dingdangnao  
       14 天前
    OSS COS 不行?一定要网盘?
    ttionya
        23
    ttionya  
       14 天前   ❤️ 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  
       14 天前 via Android   ❤️ 3
    @xiangyuecn 我劝你少管闲事(狗头.jpg )
    allanpk716
        25
    allanpk716  
       14 天前 via iPhone
    之前在微博有人做过,思路是直接把图片 N 块切开,上传发微博。然后正确组合的 index 只有你知道,做 js 插件去还原图片。大概是这个思路啊,细节记不住了。
    galenzhao
        26
    galenzhao  
       14 天前 via iPhone
    encfs
    SunsetShimmer
        27
    SunsetShimmer  
       14 天前
    有哪个网盘有 API 还允许跨域调用和加载文件的啊。。。?
    (我记得 sharepoint 好像是这样?)
    dingwen07
        28
    dingwen07  
       14 天前 via iPhone
    CBC 一下
    jim9606
        29
    jim9606  
       14 天前
    哪家网盘会允许你当图床用甚至还给可以浏览器跨域使用的 api ?
    直接基于二进制流的加密(xor ,aes)要求原图未经有损处理。
    我 i 觉得 @allanpk716 说的那个思路可以,将图片切成 MxN 的块,按一个预先指定的映射打乱块的位置,同时每一个块的 U/V 通道做一个无损变换。呈现时用 js 通过 canvas 恢复。这个方法能抵御缩放但可能抵御不了 JPEG 的 DCT 压缩。
    tutudou
        30
    tutudou  
       14 天前
    直接把所有的字节+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  
       14 天前
    网盘为啥要屏蔽图片?
    phpfpm
        32
    phpfpm  
       14 天前
    @haah 题主要搞皇瑟
    散了吧
    winglight2016
        33
    winglight2016  
       14 天前
    对抗这种检测 AI 其实挺简单,按一定规则在图片中插值,不但能防 AI 检测,还能用肉眼看不出来图片改变——也就是说,你的客户端不需要做任何处理
    AloneHero
        34
    AloneHero  
    OP
       14 天前 via Android
    @okakuyang 转 avif 不是很稳,网盘可能检测到也可能检测不到,而且一些图片格式转 avif 如果质量系数低转完太糊,质量系数高体积会膨胀,得不偿失。
    @lishoujun 客户端解压还要引入包有点麻烦
    @Tanix2
    @allanpk716 切图思路确实新奇,不过有点隐患,切的太少仍然容易被识别,切的太多客户端网络并发高,容易阻塞
    @SunsetShimmer @jim9606 只是个人用而已,可以在访问官方页面时代理到自己的页面,自己的页面注册上 service worker ,就能实现永久劫持官方页面。
    haah
        35
    haah  
       14 天前
    1 、Base64 写到页面里;
    2 、颜色分离:透明 /黑白 /彩色。
    haah
        36
    haah  
       14 天前
    加密涉及到密钥交换问题,你的场景不适用!
    lawler
        37
    lawler  
       14 天前
    @allanpk716 #25 这是技术方案。非技术的女孩们用三合一上传新浪。哈哈哈哈哈
    Greatshu
        38
    Greatshu  
       14 天前   ❤️ 2
    图片切成 9 或更多块,打乱重组成一张新图,前端还原
    CharlesGray
        39
    CharlesGray  
       14 天前
    openssl aes-256-cbc -md sha3-512 -pbkdf2 -iter 114514 -salt -in inputfile -out outputfile
    应该是最安全的加密之一了
    CharlesGray
        40
    CharlesGray  
       14 天前
    @CharlesGray 而且还不会增长文件体积,加密前后大小一样的,aes 速度也很快
    djyde
        41
    djyde  
       14 天前
    Aloento
        42
    Aloento  
       13 天前 via Android
    离谱的需求,建议重新考虑
    tsanie
        43
    tsanie  
       12 天前
    @AloneHero 不是切成多个碎块文件,是 M*N 切块打乱顺序后重新画到一张图上(这样图片看起来就像马赛克一样),客户端下下来再重新切换还原顺序绘制。
    hatsuyuki
        44
    hatsuyuki  
       12 天前
    @tsanie 很多漫画网站的 DRM 保护都用的这种方法,切块打乱顺序返回,前端排序后 canvas 绘制
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1102 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 20:10 · PVG 04:10 · LAX 13:10 · JFK 16:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.