V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
weizhixiang
V2EX  ›  问与答

申请了某些 api 服务,怎么隐藏自己的 key 啊

  •  
  •   weizhixiang · 2016-05-17 20:27:42 +08:00 via Android · 4834 次点击
    这是一个创建于 3118 天前的主题,其中的信息可能已经有所发展或是发生改变。
    请求服务要带上 key ,怎么不让别人知道,Android开发,太容易反编译了
    第 1 条附言  ·  2016-05-17 21:04:30 +08:00
    其实使用的是通联数据
    第 2 条附言  ·  2016-05-18 11:29:10 +08:00
    //贴上代码, your token 就是所谓的 key
    public class HttpUtil {
    //创建 http client
    private static CloseableHttpClient httpClient = createHttpsClient();
    private static final String ACCESS_TOKEN = "your token";
    public static void main(String[] args) throws IOException, EncoderException {
    //根据 api store 页面上实际的 api url 来发送 get 请求,获取数据
    String url = "https://api.wmcloud.com:443/data/v1/api/subject/getThemeThemes.csv?field=&ticker=000001&secShortName=&beginDate=&endDate=";
    HttpGet httpGet = new HttpGet(url);
    //在 header 里加入 Bearer {token},添加认证的 token ,并执行 get 请求获取 json 数据
    httpGet.addHeader("Authorization", "Bearer " + ACCESS_TOKEN);
    CloseableHttpResponse response = httpClient.execute( httpGet);
    HttpEntity entity = response.getEntity();
    String body = EntityUtils.toString(entity);
    System.out.println(body);
    }
    第 3 条附言  ·  2016-05-18 16:53:12 +08:00
    25 条回复    2016-05-18 14:36:20 +08:00
    msg7086
        1
    msg7086  
       2016-05-17 20:29:25 +08:00
    用 https 可以防止请求被窥探。
    pheyer
        2
    pheyer  
       2016-05-17 20:55:10 +08:00
    @msg7086 https 也可以抓包的
    Slienc7
        3
    Slienc7  
       2016-05-17 20:58:39 +08:00
    这类第三方的、需要通过 key 访问的服务,由服务器统一处理请求,然后转给客户端。
    weizhixiang
        4
    weizhixiang  
    OP
       2016-05-17 21:02:13 +08:00 via Android
    @Slienc7 还要搞服务器啊
    luili
        5
    luili  
       2016-05-17 21:30:30 +08:00 via iPhone
    传给自己的服务端,由服务端转向第三方
    audi
        6
    audi  
       2016-05-17 21:49:17 +08:00
    @msg7086 太傻太天真
    qqmishi
        7
    qqmishi  
       2016-05-17 22:22:50 +08:00 via Android
    加个中转,这样只能抓到中转服务器的数据包,没有 key
    tolbkni
        8
    tolbkni  
       2016-05-17 22:35:15 +08:00 via Android
    nginx + lua ,转发到 API 服务
    Comdex
        9
    Comdex  
       2016-05-17 22:39:51 +08:00
    通联股票数据,楼主我想问调用的 url 和端口是啥,是所有开发者都一样么?
    66CCFF
        10
    66CCFF  
       2016-05-18 01:22:52 +08:00 via iPhone
    @pheyer 来教我下抓下来怎么解出 key
    azuis
        11
    azuis  
       2016-05-18 01:36:55 +08:00 via iPhone
    @66CCFF 先装一个自签的根证书在手机上。然后用这个根证书去签那个 api 域名的 SSL 证书。再架个代理用你自签的证书去替换原有证书就可以了。你自己有 key 所以可以直接解出所有内容
    msg7086
        12
    msg7086  
       2016-05-18 01:44:04 +08:00
    @audi 请问你想说什么
    mornlight
        13
    mornlight  
       2016-05-18 01:56:28 +08:00
    如果是不可公开的 key 必须走自己服务端,没别的路子。
    yyfearth
        14
    yyfearth  
       2016-05-18 07:10:33 +08:00   ❤️ 1
    @msg7086 我觉得他只是想说 https 照样可以抓包 不能完全不透露 Key 的 就像 @azuis 和 @pheyer 说的那样

    @66CCFF 如果是网络上的中间人攻击者 如果你用 https 来保证 key 不泄漏
    那么有几种情况:
    1 如果你用的不是可信机构签发的证书 或者你不在客户端校验证书 中间人完全可以伪造证书来解密内容
    2 就算你用了可信证书 如果你不在客户端校验证书 仍然没办法保证不被盗取:
    因为就像 11L 所说 开发者经常搭建本地代理然后信任自签证书来绕过 这样就可以得到加密内容了
    如果说网上传的 key 是处理过的 不是原始 key 那么再退一步来讲 因为客户端运行在别人手中 你再怎么样藏起来 总有办法挖出来的

    所以 如果通信必须要 key 而且 key 不能公开 那么只有搭建自己的服务区来解决了
    Sharuru
        15
    Sharuru  
       2016-05-18 08:22:47 +08:00 via Android
    然后问题就变成了如何保证客户端和自己的服务端通信的时候保证内容不会泄漏了 233
    weizhixiang
        16
    weizhixiang  
    OP
       2016-05-18 08:25:06 +08:00 via Android
    @Comdex 我先申请了个个人的,给了个 token ,免费用一年
    weizhixiang
        17
    weizhixiang  
    OP
       2016-05-18 08:27:25 +08:00 via Android
    @Sharuru 内容泄露,关系不大,隔段时间换 key ,只要用我的客户端就可以了
    wesley
        18
    wesley  
       2016-05-18 09:47:11 +08:00
    不在网络中传输 key, 只传输 key 的 hash 值, 然后使用 key 作为密钥给传输数据签名:
    head:
    KeyHash: hash(key)
    Signature: hash(body_content+key)
    body:
    body_content
    msg7086
        19
    msg7086  
       2016-05-18 09:53:23 +08:00
    @yyfearth 于是我回头看了一眼,发现好像和我第一眼看到的帖子不一样了,不知道是看帖的时候还在睡眠状态,还是我回帖完了以后楼主又改了帖子。
    Comdex
        20
    Comdex  
       2016-05-18 10:03:21 +08:00
    @weizhixiang 我也是,但是不太明白调用的 url 及端口是 example 的那个么?只知道 api 的接口,如 /v2/api/getStock ,那么完整的 url 是?
    sunus
        21
    sunus  
       2016-05-18 10:28:40 +08:00
    上面的歪楼了吧。楼主问的是 Android 很容易被反编译拿到 KEY 。跟通信过程中被拦截到 KEY 不是一个问题
    lyragosa
        22
    lyragosa  
       2016-05-18 10:30:17 +08:00
    key 不要放客户端啊。自己搭个服务器中转一下不就行了……
    yyfearth
        23
    yyfearth  
       2016-05-18 12:20:21 +08:00
    @sunus 歪楼是因为 1L 的问题
    weizhixiang
        24
    weizhixiang  
    OP
       2016-05-18 12:44:50 +08:00
    @yyfearth 现在应该不会歪了
    dorentus
        25
    dorentus  
       2016-05-18 14:36:20 +08:00
    @azuis 你们 app 里面用 https 不 pin certificate 的吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2107 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:37 · PVG 08:37 · LAX 16:37 · JFK 19:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.