我们正在为我们的应用添加Dropbox支持,现在我们有了一个“app key”和“app secret”。我可以将它们保存为代码中的纯文本,如同步API教程中所列:
DBAccountManager* accountMgr =
[[DBAccountManager alloc] initWithAppKey:@"hf2hf892hf9y29h" secret:@"n29fh82h4f"];
(注意:这是一个弥补的密钥和秘密,而不是我们真实的密钥。)
但是如果他们愿意的话,有人可以从应用程序中提取它们。为了防止这种情况,我们可以添加某种基本加密来使密钥更难找到,但显然密钥仍然会在某些时候调用DropBox客户经理,所以没有办法让它们保持完美安全
这是否是任何人担心的事情,或者只是一个真正想要的人可以进入并找到钥匙的事实?
答案 0 :(得分:2)
这是否有人担心
任何理智的开发者都担心它。请使用某种形式的加密。
提示:我的态度 - 当我从AppStore下载应用程序时需要某种形式的登录[在此处插入任意web服务],我通常会解密二进制文件并运行otool
或至少strings
在上面。如果它中有明文密码/ OAuth密钥/ SSL密钥对等,我通常会立即将其删除。
真正想要的人可以进入并找出钥匙,这只是生活中的一个事实吗?
实际上,yes, even the keychain isn't secure ;-)。但是,如果主题是您的数据和/或您的用户的安全性,那么,如果没有尽力做到最好,
答案 1 :(得分:0)
首先,您的担忧是有效的。你应该把它放在钥匙串里。
然而,正如Carbonic Acid已经说过的那样,没有什么是完全安全的,甚至连钥匙链都没有。有时人们会把注意力集中在一个安全威胁上,而忽视另一个更大的问题。这很像优化,(除了表现安全性而不是性能之外)。
你不需要让你的秘密无法窃取,偷窃的成本要高于其他地方。而Dropbox API键并不完全是母鸡。
答案 2 :(得分:0)
一个更新的答案,以防其他人偶然发现这个问题。
Dropbox API OAuth 2.0 现在具有 PKCE,它不需要客户端密码来生成访问令牌。他们甚至在 their oauth guide:
中特别概述了这个用例如果您的应用是 | 应该 |
---|---|
需要后台访问的客户端桌面应用或移动应用 | 将 OAuth 代码流与 PKCE 结合使用,并带有刷新令牌。 |
如果您查看 /oauth2/token API 文档示例,您会看到 PKCE 方法不使用客户端机密。
这个附加指南 - PKCE: What and Why? - 提供了一些实现它的基本信息。
编辑:
PKCE 什么时候不合适?
在 Dropbox 实现的情况下,当您需要在后台访问 Dropbox API(即没有用户交互)时,PKCE 不合适。这是因为 oauth/token
不会不授予您刷新令牌。 (刷新令牌用于在没有用户交互的情况下生成新的访问令牌)
要在使用 PKCE 时获取刷新令牌,您需要提供 token_access_type=offline
到 oauth2/authorize
(类似于他们的代码流程)。在这一点上,我不知道为什么他们的指南推荐使用刷新令牌的代码流,如果 PKCE 可以在不存储或使用客户端密钥的情况下实现相同的。