V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
villivateur
V2EX  ›  信息安全

有什么办法只允许我开发的 APP 访问我的 WEB 服务吗?

  •  
  •   villivateur · 2021-11-11 11:12:48 +08:00 · 7306 次点击
    这是一个创建于 868 天前的主题,其中的信息可能已经有所发展或是发生改变。

    给客户做了一个 Windows WPF APP ,它需要访问我的 WEB 服务,但是我不想让除了这个客户端以外的其他工具访问 WEB 服务。

    目前已经添加了 HTTPS 。

    但是由于 APP 是用 C# 写的,反编译很方便,把认证做在 APP 内部恐怕等于没做。

    第 1 条附言  ·  2021-11-11 11:43:09 +08:00
    客户端需要访问 WEB 端,并请求解密一段二进制,然后把二进制烧录到下位机。

    主要是防止别人得到明文的二进制。

    对用户而言,他不需要认证就可以使用 APP 。
    55 条回复    2021-11-14 13:45:10 +08:00
    Xusually
        1
    Xusually  
       2021-11-11 11:19:29 +08:00
    额。。最简单的就做个登陆认证呗
    clf
        2
    clf  
       2021-11-11 11:19:34 +08:00
    自己对客户端加壳加密呗。
    AoEiuV020
        3
    AoEiuV020  
       2021-11-11 11:20:02 +08:00   ❤️ 2
    破解只有成本问题,你 app 能访问的那别人就能模拟你的 app 去访问,不可能杜绝,考虑安全也要基于这一点再考虑,做成哪怕客户端被破解被模拟也没问题,
    neptuno
        4
    neptuno  
       2021-11-11 11:24:58 +08:00
    可以考虑 1 、客户为什么用其他工具访问你的 web 服务呢(可以加一些 c#专属功能,让其他工具体验变差) 2 、如果是预防不法分子,那就混淆+各种加密,增加成本
    villivateur
        5
    villivateur  
    OP
       2021-11-11 11:31:31 +08:00
    @Xusually
    @neptuno
    @clf

    客户端需要访问 WEB 端,并请求解密一段二进制,然后把二进制烧录到下位机。主要是防止别人得到明文的二进制。
    所以对用户而言,他不需要认证就可以使用 APP 。
    lower
        6
    lower  
       2021-11-11 11:35:37 +08:00
    搞个白名单呗,,只允许客户的 ip 访问
    bootvue
        7
    bootvue  
       2021-11-11 11:38:50 +08:00   ❤️ 6
    双向 ssl 验证
    ch2
        8
    ch2  
       2021-11-11 11:41:43 +08:00
    @villivateur #5 使用一次性密钥
    coderluan
        9
    coderluan  
       2021-11-11 11:42:34 +08:00
    很多防盗措施都是自己想多了,对方要有这个能力这活也没必要给你了,相反如果你确认有人想盗版你的软件或者盗用你的服务,那么比起防止被盗,更好的手段是鉴别非法访问然后埋雷,设置成积累到一定程度再引爆,然后就轮到你坐地起价了。
    r007b34r
        10
    r007b34r  
       2021-11-11 11:43:34 +08:00
    第三方验证码接口二次认证结果生成匹配的随机浏览器 UA 指纹访问,非匹配 UA 直接拒绝响应。
    villivateur
        11
    villivateur  
    OP
       2021-11-11 11:45:10 +08:00
    @lower 但这样防不了客户

    @bootvue 客户端的私钥如何保密?
    0o0o0o0
        12
    0o0o0o0  
       2021-11-11 11:48:29 +08:00
    关键部分用 c++写,然后调用
    billgong
        13
    billgong  
       2021-11-11 11:50:40 +08:00
    @villivateur 加密狗或者 TPM 就是干这个的
    Ediacaran
        14
    Ediacaran  
       2021-11-11 11:51:33 +08:00 via iPhone   ❤️ 1
    找几个重要的工作参数,通过页面内嵌的元素获取
    jucelin
        15
    jucelin  
       2021-11-11 11:52:38 +08:00
    https 用自签证书
    Ediacaran
        16
    Ediacaran  
       2021-11-11 11:54:21 +08:00 via iPhone
    @Ediacaran 好吧看错了内容。
    每次发布都携带公钥。这样被破解了也知道谁干的
    emeab
        17
    emeab  
       2021-11-11 12:03:41 +08:00
    mtls 啊.
    PerFectTime
        18
    PerFectTime  
       2021-11-11 12:03:51 +08:00
    登记著作权,抓到就起诉
    dingwen07
        19
    dingwen07  
       2021-11-11 12:07:10 +08:00   ❤️ 3
    居然没有人提到 HTTPS 客户端验证?

    自建一个 CS ,然后给每个客户端颁发一个证书,发现泄漏就吊销掉那个证书。
    libook
        20
    libook  
       2021-11-11 12:27:28 +08:00   ❤️ 2
    C#有混淆工具吧,把代码混淆后可以提高逆向难度。有条件的话做加壳。同时可以加一些反调试方案,检测到被调试就直接退出,或者进入假逻辑。
    HTTPS 只能起到点对点数据加密,不能做到客户端识别,你可以设置成仅信任你用的签发机构的证书,避免使用自签通配符证书来抓包。
    客户端发数据给服务端的时候给 payload 做签名,签名一定要涉及时间戳,避免有破解者直接构造网络请求发给服务器。而且可以做个 ban IP 的策略,一旦接收到签名错误的请求就把 IP ban 一段时间。
    libook
        21
    libook  
       2021-11-11 12:34:03 +08:00   ❤️ 1
    看到补充内容,破解思路其实就是调试你的程序,找到解密二进制之后的程序,把解密后的内容从内存里读出来。
    你要做的就是让破解者更难以调试出可以拿到解密内容的地方,比如解密方法的返回值,以及烧录方法的参数。

    另一个思路就是者拿到解密内容也不能用,比如解密的内容不是通用的,仅当前烧录的设备可用。
    masterclock
        22
    masterclock  
       2021-11-11 12:39:20 +08:00
    简单加密一下就行了,别搞复杂了
    如果有人搞破解,说明你的服务端做得真 TMD 好,还做什么客户端,收服务端的钱就得了
    skiy
        23
    skiy  
       2021-11-11 12:54:14 +08:00
    微信扫码登录(逃
    s0nnse
        24
    s0nnse  
       2021-11-11 13:52:06 +08:00
    HTTPS 双向证书 差不多了,app 有破解风险就上 app 加固。
    powerman
        25
    powerman  
       2021-11-11 14:30:38 +08:00
    没有这个必要,微信搞得这么复杂,不还是有人去研究破解微信的协议,想啥呢,老哥,只要有利益驱动,自然有人去研究你的协议,技术手段只是防止对方低成本破解罢了。
    devcat9
        26
    devcat9  
       2021-11-11 14:31:13 +08:00
    ssl pinning
    GRPC 证书
    tmtstudio
        27
    tmtstudio  
       2021-11-11 14:59:40 +08:00
    AES+RSA
    zzzmh
        28
    zzzmh  
       2021-11-11 15:08:06 +08:00
    虽然 C#我是外行,但这个前提来说我感觉几乎做不到,再强的 app 也能被破解,就是值不值得和有没有人折腾的问题。你能做的就是请求全部加密,客户端加壳加密,但也就防住 99%的人了。如果要彻底防住,加个用户名密码,加个 token ,然后可以把没密码的人防住,但这也就不符合你的需求了。
    zjsxwc
        29
    zjsxwc  
       2021-11-11 15:11:51 +08:00
    隔三差五更换 api ,发布新版本呗
    2i2Re2PLMaDnghL
        30
    2i2Re2PLMaDnghL  
       2021-11-11 15:39:25 +08:00   ❤️ 1
    首先明确一个问题

    只允许我开发的 APP 访问我的 WEB 服务 —— 这是不可行的
    禁止别人开发的 APP 访问我的 WEB 服务 —— 这是可行的

    我直击一个本源:如果别人搞一个虚拟的下位机把你的 App 烧录的内容截取下来,你怎么处理?
    如果下位机设备你可控,那就在下位机上做处理。
    如果下位机设备通用且你不可控,那就把这个二进制进行等功能性的混淆,尽管可用但几乎不可读更难以下手修改。
    excitedXXX
        31
    excitedXXX  
       2021-11-11 15:44:55 +08:00
    效验 app 签名的 MD5 不知道这个思考可行不
    jmk92
        32
    jmk92  
       2021-11-11 15:47:08 +08:00
    最好加商业壳,不然即便是混淆也容易搞出来源码,源码到手,你怎么写加密过程都没意义了,他完全可以提取出来。
    不需要登录,那么你针对人群有限的话可以搞双向证书,如果是面向全网都可以下载的,那就做机器码、AES 加密。
    当然,前提还是加壳,不然一直盯着数据统计,看有没有虚假请求,也能累坏你啊
    bruce0
        33
    bruce0  
       2021-11-11 16:24:55 +08:00
    不想被别人调用服务 HTTPS 双向认证应该能满足你的需求, 如果怕别人破解 app 拿到证书, 用 C++写相关的代码, 加大反编译难度
    ivan_wl
        34
    ivan_wl  
       2021-11-11 20:15:57 +08:00
    我和你的场景差不多,可以用 ReadyToRun 做 AOT 编译,编译成 native 指令,至少增加破解难度。客户端认证可以用 WatsonTcp ,支持双向证书认证。客户端的私钥可以混淆后嵌入到 resource 里,代码里处理一下。
    dadachen1997
        35
    dadachen1997  
       2021-11-11 22:15:12 +08:00
    添加一个 header 字段吧,x-functions-key 做 check
    ZeroClover
        36
    ZeroClover  
       2021-11-11 22:21:44 +08:00
    加钱 VMProtect ,除非你的 App 有很大的商业价值否则不会有多少人愿意搞动态分析的。

    然后 TLS 相互认证。
    ColinWei
        37
    ColinWei  
       2021-11-11 22:46:44 +08:00   ❤️ 1
    Dnguard HVM 用好几年了,火车头也是用这个
    march1993
        38
    march1993  
       2021-11-11 22:48:40 +08:00   ❤️ 1
    下位机读取网卡的 mac 然后用代码验证
    22too
        39
    22too  
       2021-11-11 22:49:59 +08:00
    加一个识别,每次访问必须上传口令,口令认证在另外一个域名下。口令成功,然后再使用口令给业务的域名使用。应该就切割开了。
    XiLingHost
        40
    XiLingHost  
       2021-11-11 22:55:25 +08:00
    每次访问服务端生成一个二进制可执行文件,然后覆写本地的程序用于下次请求,结合服务端 /客户端双向签名认证,一次访问生成一次新的证书并吊销旧证书,证书加密硬编码在二进制文件中
    IvanLi127
        41
    IvanLi127  
       2021-11-11 23:30:54 +08:00 via Android
    只要经常无故崩溃,应该能让想破解的人崩溃
    dingwen07
        42
    dingwen07  
       2021-11-11 23:45:14 +08:00 via iPhone
    @XiLingHost #40 这算任意代码执行漏洞了
    robinlovemaggie
        43
    robinlovemaggie  
       2021-11-12 00:06:12 +08:00
    参考银行的做法,强加密和强认证
    SIGEV13
        44
    SIGEV13  
       2021-11-12 04:33:30 +08:00
    双向认证。
    再强点可以用智能卡、TPM 等硬件。
    akira
        45
    akira  
       2021-11-12 05:49:55 +08:00
    客户端上 2 步验证,绑定手机 绑定 ip
    passerbytiny
        46
    passerbytiny  
       2021-11-12 06:02:08 +08:00 via Android
    “只允许我开发的 APP 访问我的 WEB 服务,但用户不用登录”,这并不是无需认证,而是认证规则从“用户”,变成了“应用程序”。这当然是可以做的,从应用分发 /购买上加密钥就能实现,典型的就是物理密钥——加密狗。

    移动平台下,理论上更好做,比如说付费解锁功能的验证。 你可以尝试借助付费验证来做认证:把访问后台的客户端功能,做成一个 1 分钱解锁的客户端功能;同时,把付费验证信息,作为后台接口的动态认证令牌。
    2bNot2b
        47
    2bNot2b  
       2021-11-12 09:45:51 +08:00
    必须登录+双向证书认证+参数校验+商业壳基本就稳了
    gollwang
        48
    gollwang  
       2021-11-12 09:53:53 +08:00
    你能同时在两个手机登录微信吗?
    不行的话,这是不是一种思路
    pkoukk
        49
    pkoukk  
       2021-11-12 10:00:37 +08:00
    混淆一下就行了,没必要整那么复杂。
    市面上非常多的正在运行的 APP 连混淆都没做,其中不乏一些不小的公司产品
    duanxianze
        50
    duanxianze  
       2021-11-12 10:07:32 +08:00
    这个思路本身不合理,楼上一个老哥说的对,如果你的服务真的那么好,值得别人来破解你的客户端,那么你直接对服务收费就好了,花费大力气加密流程得不偿失。
    zhw2590582
        51
    zhw2590582  
       2021-11-12 10:14:41 +08:00
    真的有人会为了访问接口,去反编译你的 app 吗,这么值钱的话
    rehoni
        52
    rehoni  
       2021-11-12 11:10:46 +08:00
    单点登录,两步验证,IP 限制;感觉都是思路
    cppc
        53
    cppc  
       2021-11-12 12:00:06 +08:00
    看了楼主的附言,目的是保护从服务端下载到的数据不被窃取。但这是个不靠谱的需求,因为别人已经下载了,你光想着保护传输过程没用呀。
    009694
        54
    009694  
       2021-11-13 11:12:27 +08:00 via iPhone
    换个思路 。 不要在 windows 里做加密防护,在下位机做。 你可以把二进制代码段做一个加密,由下位机写入的时候解密,密钥内置在下位机里
    tyrantZhao
        55
    tyrantZhao  
       2021-11-14 13:45:10 +08:00
    白名单服务,特定 IP 可以访问
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5466 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 08:30 · PVG 16:30 · LAX 01:30 · JFK 04:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.