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

开源一个图片加密算法

  •  
  •   jiangwei2222 · 2021-09-23 21:41:02 +08:00 · 5373 次点击
    这是一个创建于 1143 天前的主题,其中的信息可能已经有所发展或是发生改变。

    GitHub 地址:

    https://github.com/Jinnrry/Jencryption

    特点

    加密前后均为图片格式且加密后图片的尺寸与加密前保持一致。

    目前提供了 golang 版本的 api 以及 js 版本的 sdk

    加密 Demo:

    加密前: befo 加密后: after

    有啥用?

    1 、反扒(比如我前公司,核心资产就是各个景区的高清图片,放出来很容易被扒走)

    2 、盗链 (将自己的私有图片加密后放到公开的 cdn 上,不怕对方知道图片内容,比如使用新浪 cdn 发 1024 [狗头])

    3 、防盗链(图片都加密了,别人盗过去也不知道杂用)

    4 、用于在公开论坛传输一些不符合社会主义核心价值观的图片(比如在 V 站开车[狗头] )

    使用方法:

    1 、使用编译好的二进制文件加解密

    加密当前文件夹内全部图片 Jencryption encrypt [密码]

    加密指定文件夹 /图片 Jencryption encrypt [路径] [密码]

    解密当前文件夹 Jencryption decrypt [密码]

    解密指定文件夹 /图片 Jencryption decrypt [路径] [密码]

    2 、使用 js sdk 在你的网站接入

    <script src="/js/md5.min.js"></script>
    <script src="/js/core.js"></script>
    <script>
    DecryptAllImage("你的密码")  // 解密页面上全部图片
    // DecryptImage(document.getElementById("img"),"你的密码")  // 解密单张图片
    
    </script>
    

    3 、在线加解密工具 https://xjiangwei.cn/Jencryption/

    有谁用?

    目前在我自己的博客( https://www.xjiangwei.cn)文章中已经全部接入图片加密

    目前缺陷

    1 、加密性能不够好,加解密过程有大量 hash 运算。另外加密后图片体积会变大很多

    2 、加密后的图片太丑了

    3 、加密后的图片不能被压缩,一旦图片出现了任何像素点变化就凉凉了

    4 、目前 js sdk 只能处理 img 标签中的图片,css 中的图片不能处理

    28 条回复    2021-09-29 14:29:06 +08:00
    40EaE5uJO3Xt1VVa
        1
    40EaE5uJO3Xt1VVa  
       2021-09-23 21:48:30 +08:00
    这玩意好,star 了
    40EaE5uJO3Xt1VVa
        2
    40EaE5uJO3Xt1VVa  
       2021-09-23 21:51:57 +08:00
    性能确实不咋地,缺点不是问题,只要开源了我们给想办法解决。我先看看代码。
    polaa
        3
    polaa  
       2021-09-23 21:52:16 +08:00
    简单看了下就是 rgb 的偏移么 emmm
    polaa
        4
    polaa  
       2021-09-23 21:56:19 +08:00
    不是很理解为什么不使用现代密码学的算法做加密
    xingheng
        5
    xingheng  
       2021-09-23 21:58:48 +08:00
    我不太理解,既然加密之后的结果不是混淆,那么为什么我不直接使用 openssl 把图片当成一个普通文件加解密?
    另一个问题,你的密码在客户端 js 层怎么做混淆的
    0ZXYDDu796nVCFxq
        6
    0ZXYDDu796nVCFxq  
       2021-09-23 22:03:35 +08:00 via Android   ❤️ 2
    反正你这算法和 psk 都是公开的,不如干脆把图片旋转 180 度,再用 js 旋转回来
    性能好,不增加空间
    AoEiuV020
        7
    AoEiuV020  
       2021-09-23 22:24:49 +08:00 via Android
    反正密码要放在前端解密用,那别人爬走批量解密不就好了,
    Kaciras
        8
    Kaciras  
       2021-09-23 22:39:08 +08:00   ❤️ 1
    1 、核心资产为什么要放出来。
    3 、直接保存解密后的图片不行么。
    4 、怎么解密,要让用户装插件么。

    唯一有用的就是 2 嫖图床,但是人家会不会压缩优化,压完还能解密吗?
    jiangwei2222
        9
    jiangwei2222  
    OP
       2021-09-23 22:43:48 +08:00 via Android
    @polaa 因为没有现成能直接用且提供 jssdk 的,就自己随手写了一个
    whileFalse
        10
    whileFalse  
       2021-09-23 22:45:10 +08:00
    你的思路是保证图片加密后仍然是图片,导致加密结果不可压缩,非常大
    那么为什么不换种思路,直接把图片加密成二进制,保障图片的压缩效率呢?
    jiangwei2222
        11
    jiangwei2222  
    OP
       2021-09-23 22:45:51 +08:00 via Android
    @xingheng 用在网页端的话 js 首先得混淆,另外你全站密码不能只用一个,你可以服务端动态加密,密码不固定

    另外,客户端场景无论怎么加密仅仅是增加爬取难度而已
    jiangwei2222
        12
    jiangwei2222  
    OP
       2021-09-23 22:47:41 +08:00 via Android
    @whileFalse 因为加密成二进制可能很多地方都需要改动,而且很多图床就不行了

    设计这个的初衷就是加密结果也是图片
    whileFalse
        13
    whileFalse  
       2021-09-23 22:49:35 +08:00 via iPhone
    @jiangwei2222 但是很多图床都会二次压缩,你试过主流图床了吗
    jiangwei2222
        14
    jiangwei2222  
    OP
       2021-09-23 22:49:50 +08:00 via Android
    @yanzhiling2001 其实我最早的想法是要做成二维码那种形式,可以随意压缩,可以通过扫码方式传播。
    jiangwei2222
        15
    jiangwei2222  
    OP
       2021-09-23 22:52:09 +08:00 via Android
    @Kaciras 类似大众点评的业务,点评数据就是核心资产,但是也得放出来给人看呀。

    加密仅仅是为了增加爬取成本。

    解密是你程序解密
    xujinkai
        16
    xujinkai  
       2021-09-23 23:35:24 +08:00 via Android
    我先声明我没看代码,看楼上说的好像没用现代加密算法。
    我提供一个思路,先用对称算法( AES 或 SM4 )加密二进制流,然后用某种规则编码成为图片。
    这样可以实现加密任何内容,编码规则设计的好还能抗压缩。
    以前搜过一些往图片里隐写数据的软件,挺有意思的。
    zagfai
        17
    zagfai  
       2021-09-24 00:55:46 +08:00
    做个身份验证再发送图片数据不就可以了?
    iseki
        19
    iseki  
       2021-09-24 06:21:33 +08:00 via Android
    除非你这个算法可以保证压缩后解密可以实现,否则和主流现代密码相比没啥好处,都可以编码成图,都是压一下就坏透了
    zhw2590582
        20
    zhw2590582  
       2021-09-24 08:17:45 +08:00
    这种情况,加密后可以不用是图片了,那就可以进一步压缩
    zhw2590582
        21
    zhw2590582  
       2021-09-24 08:18:43 +08:00
    而且完全可以用 web worker 解密
    villivateur
        22
    villivateur  
       2021-09-24 08:36:34 +08:00 via Android
    如果被压缩了之后,还能解密吗?
    cpstar
        23
    cpstar  
       2021-09-24 09:34:10 +08:00
    想到的一些思路不知道对不对啊,不针对 LZ 的算法:
    首先,肯定是对称加密,然后服务器给客户端的是加密内容,客户端解密再给浏览器渲染;
    其次,既然是对称加密,只要密码算法和密钥知道,就可以随意解密;
    最后,密码算法肯定要传给客户端,所以不可能 100%保密,那么能否在密钥上做文章,比如服务器端动态加密以及动态密钥?
    另外,浏览器既然已经渲染了,是否能够控制浏览器不得保存渲染出来的版本?或者在浏览器端屏幕拷贝(截图)能否有方案处置?
    cpstar
        24
    cpstar  
       2021-09-24 09:36:28 +08:00
    关于加密算法被客户端破解的可能,能否使用 webassembly 增加破解难度?
    jiangwei2222
        25
    jiangwei2222  
    OP
       2021-09-24 10:47:17 +08:00 via Android
    @villivateur 不能


    @cpstar 在客户端使用场景来说,不可能 100%保密
    vazo
        26
    vazo  
       2021-09-24 17:41:37 +08:00
    感谢楼分享,思路值得学习,支持一下.
    OOKer
        27
    OOKer  
       2021-09-26 13:01:27 +08:00
    好巧,我最近也在研究图像加密。
    这个研究方向应该叫“图像伪造”,已经有很好的加密算法了。
    xieqiqiang00
        28
    xieqiqiang00  
       2021-09-29 14:29:06 +08:00
    图片转 jpg 就无效了,看起来被压缩过就不能解密了?
    不是很实用,那不如像上面讲的直接当文件压缩加密算了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1049 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 23:17 · PVG 07:17 · LAX 15:17 · JFK 18:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.