保护 Dropbox 访问令牌
Securing the Dropbox access token
所以我正在使用 Xamarin Android 制作一个供公司客户使用的保管箱应用程序(不会在 Playstore 上发布)。由于它的所有用户都使用同一个保管箱帐户,因此应用程序的访问令牌在源代码中被硬编码如下:
var dbx = new DropboxClient("abc_token_xyz")
我觉得这不是最好的方法,因为如果有人拿到 apk,他们可以反编译应用程序并查看令牌。
我的问题是保护令牌的最佳方式是什么?或者我什至应该使用这种方法?
访问令牌对于设备应该是唯一的,而不仅仅是对于用户。 单独的设备令牌需要单独撤销访问权限,这是您必须考虑的事情:如果设备丢失/被盗怎么办?如果设备的用户出售设备/更换设备怎么办?
每次有设备 lost/stolen/transferred/decommissioned 在所有设备上推出一个新版本真的不是你想要做的。
此答案的有效性与令牌所针对的服务无关(而且我不知道 Dropbox 的具体细节)。 为所有用户使用同一个 Dropbox 帐户可能不是一个好主意(出于法律和/或安全原因)。例如,您应该确保单独的令牌不足以更改密码或影响其他令牌,或者如果设备丢失,您的安全性将失效,即使您每个设备有不同的令牌。另外,我不知道您的提议是否违反了他们的服务条款。
Dropbox API 旨在让每个用户 link 拥有自己的 Dropbox 帐户,以便与自己的文件进行交互。但是,如您所示,技术上可以连接到一个帐户。
如前所述,问题是可以从应用程序中提取访问令牌。这是一个更根本的问题,不仅仅是 Dropbox API。也就是说,客户端应用无法保密。虽然您可以采取各种尝试来增加提取令牌的难度,但您不能让它变得不可能。
因此,非常不推荐这种方法。一旦有人拥有访问令牌,他们就可以使用它来绕过您试图强制执行的任何访问控制,甚至可以撤销访问令牌本身,从而破坏您的应用程序。
不过,为了稍微解决您的第一个问题,您可以:
- 混淆代码中的令牌,以便在检查应用程序时它不是简单的字符串。我确信 Java 中已经有很好的混淆资源可用。请注意,它可以被取消混淆。
- 加密访问令牌。请注意,加密密钥也需要对应用程序可用,因此也可以提取它,以便解密访问令牌。
此外,这两种技术都无法防止有人对设备执行中间人攻击(通过在设备上安装受信任的证书)并检查 API 来自应用程序本身来查看令牌。
所以我正在使用 Xamarin Android 制作一个供公司客户使用的保管箱应用程序(不会在 Playstore 上发布)。由于它的所有用户都使用同一个保管箱帐户,因此应用程序的访问令牌在源代码中被硬编码如下:
var dbx = new DropboxClient("abc_token_xyz")
我觉得这不是最好的方法,因为如果有人拿到 apk,他们可以反编译应用程序并查看令牌。
我的问题是保护令牌的最佳方式是什么?或者我什至应该使用这种方法?
访问令牌对于设备应该是唯一的,而不仅仅是对于用户。 单独的设备令牌需要单独撤销访问权限,这是您必须考虑的事情:如果设备丢失/被盗怎么办?如果设备的用户出售设备/更换设备怎么办?
每次有设备 lost/stolen/transferred/decommissioned 在所有设备上推出一个新版本真的不是你想要做的。
此答案的有效性与令牌所针对的服务无关(而且我不知道 Dropbox 的具体细节)。 为所有用户使用同一个 Dropbox 帐户可能不是一个好主意(出于法律和/或安全原因)。例如,您应该确保单独的令牌不足以更改密码或影响其他令牌,或者如果设备丢失,您的安全性将失效,即使您每个设备有不同的令牌。另外,我不知道您的提议是否违反了他们的服务条款。
Dropbox API 旨在让每个用户 link 拥有自己的 Dropbox 帐户,以便与自己的文件进行交互。但是,如您所示,技术上可以连接到一个帐户。
如前所述,问题是可以从应用程序中提取访问令牌。这是一个更根本的问题,不仅仅是 Dropbox API。也就是说,客户端应用无法保密。虽然您可以采取各种尝试来增加提取令牌的难度,但您不能让它变得不可能。
因此,非常不推荐这种方法。一旦有人拥有访问令牌,他们就可以使用它来绕过您试图强制执行的任何访问控制,甚至可以撤销访问令牌本身,从而破坏您的应用程序。
不过,为了稍微解决您的第一个问题,您可以:
- 混淆代码中的令牌,以便在检查应用程序时它不是简单的字符串。我确信 Java 中已经有很好的混淆资源可用。请注意,它可以被取消混淆。
- 加密访问令牌。请注意,加密密钥也需要对应用程序可用,因此也可以提取它,以便解密访问令牌。
此外,这两种技术都无法防止有人对设备执行中间人攻击(通过在设备上安装受信任的证书)并检查 API 来自应用程序本身来查看令牌。