保护 iOS 应用中的图像

protect an image in an iOS app

我有一个 iOS 应用程序,它显示来自后端 (amazon S3) 的图像,我想阻止用户在 iOS 应用程序之外查看图像。

实际上,后端发送图像的 base64 表示,为了简单起见,我们缩短一张图像的 base64 并假设其表示为:

vQNBX1vW19ekvrrvi7eCqDH04QmUs1i3u4WpXjX3tQ2gh

如果用户使用代理,他可以很容易地拦截 http 调用并查看生成的 json 响应,类似于

{ "img" : "vQNBX1vW19ekvrrvi7eCqDH04QmUs1i3u4WpXjX3tQ2gh"} 

有了这些信息,用户可以保存它,他将能够在 iOS 应用程序之外查看它。

这就是我考虑 "hidding" 真实图像的原因。为了简单起见,我将绳子分成两部分,然后将它们反转; json 文件会变成这样:

{ "img" : {
    "part1" : "0HDqCe7ivrrvke91Wv1XBNQv",
    "part2" : "hg2Qt3XjXpW4u3i1sUmQ4"
  }
} 

(当然混淆算法会复杂得多,iOS 将负责处理这个并重建真实图像)

我的问题是:这真的是 efficient/secure 吗?由于解密算法将硬编码在 iOS 应用程序中,因此我的感觉有所缓解,发现它会很容易吗?

当然这不会阻止用户拍摄快照,但我对此没有意见。

如果按照@zaph 的建议,您使用严格的 HTTPS 和证书固定,那么用户将无法使用代理或其他网络监控工具来查看传输中的图像。

如果只允许经过身份验证的客户端下载图像,并使用一些合理的身份验证方法,则可以将能够访问图像的人限制为经过身份验证的用户。

如果您使用一些从用户身份验证秘密派生的密钥,或客户端和服务器之间共享的一些其他秘密,来加密图像服务器端并在客户端解密它,并且您在这种情况下导出密钥推导既不明显又计算困难的方式,那么你会让编写脚本下载图像的用户感到困惑。

如果您实施所有这些,您可能会使事情变得非常困难,以至于绝大多数用户将无法或不够关心检索图像。但是,一个有决心的用户,通过付出努力 and/or 资本,仍然能够拉出图像。最终,他们将能够编写脚本来下载图像并删除您实施的任何 encryption/obfuscation;那里有至少和你一样聪明的攻击者。您所能期望的最好结果是让它尽可能耗时、困难和昂贵,这样聪明的攻击者就不会费心去尝试了。