V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
这是一个专门讨论 idea 的地方。

每个人的时间,资源是有限的,有的时候你或许能够想到很多 idea,但是由于现实的限制,却并不是所有的 idea 都能够成为现实。

那这个时候,不妨可以把那些 idea 分享出来,启发别人。
v2yllhwa
V2EX  ›  奇思妙想

纯前端的加密访问

  •  
  •   v2yllhwa · 2023-03-07 14:13:29 +08:00 via Android · 3757 次点击
    这是一个创建于 656 天前的主题,其中的信息可能已经有所发展或是发生改变。

    抛开各种鉴权不谈,只是想实现一个简单的全站加密(或者说授权访问)。比较常见的应用就是给朋友分享一下自己写的网站,但是不想被公开访问(考虑到可能托管在各类 pages 上面,希望可以纯前端实现)。

    目前的思路是用 service worker 劫持所有的资源( html,js,css )请求,用非对称解密之后再返回。

    有这种已经实现的轮子吗?或者有没有更好的方案。

    35 条回复    2023-03-10 10:01:50 +08:00
    Jammar
        1
    Jammar  
       2023-03-07 14:19:39 +08:00
    套个 iframe 里面登录
    teem
        2
    teem  
       2023-03-07 14:20:41 +08:00   ❤️ 1
    页面弹窗输入密码访问,密码告诉朋友
    liyang5945
        3
    liyang5945  
       2023-03-07 14:20:43 +08:00
    劫持所有资源不现实,有已经实现的轮子,hexo 有插件可以把文章内容加密成乱码(查看 html 源码也是乱码),输入密码后访问
    jybox
        4
    jybox  
       2023-03-07 14:24:00 +08:00   ❤️ 1
    tool2d
        5
    tool2d  
       2023-03-07 14:26:04 +08:00
    service worker 这种最容易被破解了,和主线程交互几乎都是固定 API ,拦截一下返回值就行了。

    你还不如写在 JS 代码里,混淆一下。

    除非你网站不可替代,要不然没几个人会反编译混淆后的 JS 。
    leimao
        6
    leimao  
       2023-03-07 14:27:26 +08:00
    leimao
        7
    leimao  
       2023-03-07 14:29:09 +08:00
    mxT52CRuqR6o5
        8
    mxT52CRuqR6o5  
       2023-03-07 14:31:26 +08:00
    @tool2d 得有密钥才能解密啊
    tool2d
        9
    tool2d  
       2023-03-07 14:33:20 +08:00
    @mxT52CRuqR6o5 在 service worker 里 hook api ,返回的应该就是明文了。
    duanxianze
        10
    duanxianze  
       2023-03-07 14:43:01 +08:00
    直接在 nginx 加个鉴权不就好了?
    kaedeair
        11
    kaedeair  
       2023-03-07 14:47:59 +08:00
    网关负责鉴权就行了
    hingle
        12
    hingle  
       2023-03-07 14:55:30 +08:00
    直接用 /path 当成密码就行了
    mxT52CRuqR6o5
        13
    mxT52CRuqR6o5  
       2023-03-07 14:55:56 +08:00
    @tool2d 你得先有秘钥,才有可能 hook 到解密完的明文
    tool2d
        14
    tool2d  
       2023-03-07 15:02:48 +08:00
    @mxT52CRuqR6o5 没理解,按照楼主的思路,在 service worker 里出来的就是文件明文了啊。

    密文仅仅是 url fetch 返回的结果,worker 都内部处理过一次了。如果这时候还没有密钥,那浏览器也没办法解析 html 了。
    liuidetmks
        15
    liuidetmks  
       2023-03-07 15:05:01 +08:00
    liuidetmks
        16
    liuidetmks  
       2023-03-07 15:06:16 +08:00
    @liuidetmks 页面很轻巧,使用浏览器自带的 crypto API 实现,没有引入其他库。
    mxT52CRuqR6o5
        17
    mxT52CRuqR6o5  
       2023-03-07 15:06:42 +08:00
    @tool2d 密钥前端输入(比如 input 文本框,又或者放到 url query 里),得到秘钥再去 fetch ,service worker 劫持请求用秘钥解密
    tool2d
        18
    tool2d  
       2023-03-07 15:07:14 +08:00
    @mxT52CRuqR6o5 哦,我理解你意思了。就是加密私密 blog ,不输入密钥没办法查看那种。

    因为我看到楼主开头写的是加密 html/js/css 全部资源,还以为是自动解密,不需要输入密码那种。
    v2yllhwa
        19
    v2yllhwa  
    OP
       2023-03-07 15:48:35 +08:00 via Android
    @teem 这里讨论的是实现方式,即弹窗输入密码后怎么解密的问题
    libook
        20
    libook  
       2023-03-07 15:49:42 +08:00
    感觉挺有趣的,理论可行,没有见过相关实现,题主可以做一个,我去 star 。
    v2yllhwa
        21
    v2yllhwa  
    OP
       2023-03-07 15:50:23 +08:00 via Android
    @liyang5945 为什么劫持所有资源不现实呢? hexo 的加密插件我知道,但是仅限于 hexo 能用吧。例如我平时写点前端的小玩意儿打包出来就不能用了。而且用框架的话,主要内容可能都在 js 里面,只加密 html 应该是不行的。
    v2yllhwa
        22
    v2yllhwa  
    OP
       2023-03-07 15:53:50 +08:00 via Android
    @jybox 看起来不错,可惜不能同时加密 js 等资源。
    v2yllhwa
        23
    v2yllhwa  
    OP
       2023-03-07 15:55:09 +08:00 via Android
    @duanxianze 主题里说过了,可能会托管在 github pages/cloudflare pages 等等,不考虑后端的配合。
    v2yllhwa
        24
    v2yllhwa  
    OP
       2023-03-07 15:56:35 +08:00 via Android
    @hingle 这个方法我确实用过。但是让我感到疑惑的是这个链接(形如 xxx.com/<uuid>)很快就被 bing 收录了,我怀疑是 edge 浏览器对用户浏览的页面进行上报了。
    vizards
        25
    vizards  
       2023-03-07 16:03:33 +08:00 via iPhone
    配合 webpackJsonP 的类似实现,例如重度使用此功能的 webpack5 module federation 可以实现运行时 dynamic import 进相关的 js 代码文件块(加密后),在 service-worker 层挂一个劫持逻辑做解密,或许具有可操作性?编译时要多做一步加密 jsbundle 的操作
    yaphets666
        26
    yaphets666  
       2023-03-07 16:29:22 +08:00
    某几个页面不要服务端渲染,#xxxx 的路由还会被收录吗?
    TomVista
        27
    TomVista  
       2023-03-07 16:39:31 +08:00
    把解密方法做成油猴给朋友.
    azui999
        28
    azui999  
       2023-03-07 17:11:55 +08:00
    不想被公开访问?
    把你朋友拽到你屏幕前面并捆绑住他的手脚,以免他拍照录像,
    这样基本就能以绝后患了
    Envov
        29
    Envov  
       2023-03-07 19:25:43 +08:00
    我觉得题主说的方法就是很好的方法
    kele999
        30
    kele999  
       2023-03-08 20:04:21 +08:00
    叫朋友去你家看
    sobev
        31
    sobev  
       2023-03-09 10:17:45 +08:00
    github page hexo 主题,有个插件可以输入密码后访问
    ![]( )
    xieqiqiang00
        32
    xieqiqiang00  
       2023-03-09 11:46:19 +08:00
    “比较常见的应用就是给朋友分享一下自己写的网站,但是不想被公开访问”
    你需要的不是 0 信任网络么
    xieqiqiang00
        33
    xieqiqiang00  
       2023-03-09 11:48:42 +08:00
    QiaTia
        34
    QiaTia  
       2023-03-09 18:05:36 +08:00
    我记得 confirm ,prompt ,alert 这几个 js 方法是能中断浏览器进程, 如果想做的足够轻直接使用 prompt 足够了
    akakidz
        35
    akakidz  
       2023-03-10 10:01:50 +08:00
    内容全部加密发布,给你朋友本地浏览器安装个油猴脚本,本地解密
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1070 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 23:29 · PVG 07:29 · LAX 15:29 · JFK 18:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.