【问题标题】:iOS safely pass content between appsiOS 在应用程序之间安全地传递内容
【发布时间】:2014-05-04 18:41:11
【问题描述】:

我很好奇是否有一种方法可以在 iOS 上的应用之间安全地传递内容。最终目标是在两个 ios 应用之间实现 oauth。

由于不保证应用程序具有唯一的 url 方案,因此此选项已失效。

我考虑过使用钥匙串组,但没有这方面的经验。看起来应用需要准确指定哪些应用可以访问钥匙串项。

还有其他选择吗?是否有某种标识符(例如 android bundle ID)可用于在请求期间验证应用程序?

【问题讨论】:

    标签: ios security mobile oauth keychain


    【解决方案1】:

    您可以为此使用 URL 方案。

    基本流程

    您将拥有一个 ServerApp 和许多 ClientApp。 ServerApp 监听像serverapp:// 这样的 URL 方案。然后,客户端可以调用服务器以请求其进行身份验证。客户端也必须实现 URL 方案。例如。 ClientAppOne 实现了 URL 方案clientapp1://。服务器将指向客户端应用程序的反向链接作为参数。例如。客户端调用 URL serverapp://auth?back=clientapp1%3A%2F%2Fserverapp-auth(这里的反向链接是clientapp1://serverapp-auth,并且已经被 urlencoded)。

    服务器然后检查用户身份,向他询问权限、密码等,然后使用反向链接提供数据。反向链接的确切工作方式是特定于应用程序的,但您通常至少需要两个部分:访问令牌和用户名。例如。然后反向链接将是clientapp1://serverapp-auth?success=1&token=fi83ia8wfzi3s8fi8s3f8si8sf&user=robert 或者可能在错误clientapp1://serverapp-auth?success=0&errno=421 的情况下。然后客户端需要通过一些公共(或私有)API 来验证访问令牌,例如https://serverapp.example.com/userdetails?apikey=fai83jw93fj93389j&token=fi83ia8wfzi3s8fi8s3f8si8sf。服务器会返回一些结构化的响应。

    必要的组件

    1. 服务器应用程序上的 URL 方案
    2. 每个客户端应用程序上的 URL 方案
    3. 将包含在每个客户端应用程序中并处理身份验证详细信息的 SDK 和标准 UI 组件(例如,facebook 有一个标准按钮,上面写着“使用 facebook 登录”,因此 ServerApp 需要一些可重新识别的类似“使用 ServerApp 登录”的按钮)
    4. 提供可通过访问令牌访问的服务的服务器。
    5. 定义的 API,解释客户端如何与服务器通信
    6. 要包含在客户端中处理此类客户端-服务器通信的 SDK(应该是组件 3 中提到的 SDK 的一部分。)
    7. 也许是一个 wiki,记录了上述所有步骤,这样您和其他开发人员就不会迷失方向
    8. 一种使访问令牌无效的方法,以及一种让客户端检测访问令牌是否已无效的方法。此外,如果用户更改密码,所有访问令牌都应失效。

    随机笔记

    1. 在您的客户端应用程序中,您可以通过调用[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"serverapp://auth"]] 来检查是否安装了服务器应用程序。
    2. URL 方案应该足够无冲突。这些 URL 永远不会被用户看到,只有开发人员才能看到,因此它们不必漂亮。你可以例如将 iTunes-Connect-App-ID 附加到您的 URL 方案中,例如 serverapp1234567://。这将大大降低某天其他应用使用相同 URL 方案的可能性。

    【讨论】:

    • 嗨迈克尔,感谢您的回复。不过,我不确定我是否在关注。也许我没有很好地解释我的问题。因为方案有可能发生冲突,所以我不能确定当一个应用程序通过方案将内容传递给另一个应用程序时,它将与正确的应用程序对话。因此,方案本质上是脆弱的,不能用于 oauth。
    • 如果你的方案命名得当,它只会在其他应用程序作者故意实现相同方案时发生冲突。密码永远不会在应用程序之间传递。恶意客户端可能会实施与特定有效客户端相同的方案,并可能拦截反向链接并将令牌发送到某个受感染的服务器。如果发生这种情况,您应该向苹果报告。恶意服务器可能会从某些客户端获取登录请求。在所有这些情况下,安全性已经受到威胁,因为您安装了恶意应用程序。你当然也可以加密你传递的数据......
    • @RobertKotcher 还有,我担心你找不到更安全的方法来实现你的目标......
    • 这也是我所关心的。并且使用 ssl 并不能防止这种攻击,因为攻击者不需要拦截数据。恶意用户只需将完全相同的方案写入他的应用程序,一旦用户安装它,所有数据都会传递给恶意应用程序。
    • 我发现了一些我无法以这种方式妥协的 iOS 应用程序,我对他们如何克服这一点非常感兴趣。我已经尝试在合法应用之前和之后安装我的恶意应用(研究),尽管这种尝试不适用于某些应用。
    猜你喜欢
    • 2012-09-07
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 2018-10-03
    • 2016-06-07
    • 2016-01-05
    相关资源
    最近更新 更多