【发布时间】:2015-12-21 00:06:15
【问题描述】:
我渴望为用于连接外部服务(例如收费的 API)的凭据实现高级别的安全性。
如果我将凭据作为 .so(二进制)存储在 C 库中,并使用 JNI 和应用程序签名密钥访问它们,这听起来是否足够保护?
我正在尝试评估攻击者反编译或反向工程以访问凭据的难易程度。
【问题讨论】:
标签: android security encryption obfuscation
我渴望为用于连接外部服务(例如收费的 API)的凭据实现高级别的安全性。
如果我将凭据作为 .so(二进制)存储在 C 库中,并使用 JNI 和应用程序签名密钥访问它们,这听起来是否足够保护?
我正在尝试评估攻击者反编译或反向工程以访问凭据的难易程度。
【问题讨论】:
标签: android security encryption obfuscation
许多开发人员都在为安全概念而苦恼。许多人试图以不同的名称将密码隐藏在应用程序的某处“这样没人能找到它们”,其他人则试图将它们编译或加密到应用程序中,等等......我们真的需要了解隐藏是不是 安全性。
如果您将密码编译到您的应用程序中,黑客可以很容易地从那里获取它。逆向工程并不难。如果您的应用程序很受欢迎,或者黑客值得通过努力在二进制文件中找到密码,我可以向您保证他们会找到它。
一些开发人员会告诉您在将密码编译为二进制文件之前对其进行加密。太好了,现在您必须将加密密钥保存在某个地方,不是吗?在哪里?将其编译到应用程序中,您又回到了原点。
您需要以黑客无法访问的方式将您的机密(密码本身,或者如果密码已加密,则为加密密钥)存储在您的应用之外。所以你需要考虑的真正问题是:将你的秘密存储在哪里,以便应用程序可以读取它,而黑客却不能?
如何实现这一点实际上取决于您的设计。例如,如果收费 API 由您安全地进行身份验证的用户访问,那么您可以使用用户的凭据安全地访问 API。这样,无需全局凭据即可访问 API。
举个例子来说明这一点:我使用我的凭据(通过 HTTPS)登录到您的应用,然后选择需要访问计费 API 的功能。您的应用程序向 API 发送 HTTPS 请求,并在请求中包含我的凭据(标题、URL 或正文,无论您喜欢什么,因为它们都受 HTTPS 保护)。 API 接收请求,验证我的凭据(以与登录过程类似的方式)并将结果返回给应用程序(如果凭据错误,则返回“访问被拒绝”错误)。
【讨论】:
如果密钥在您的应用程序中,那么有动力的黑客可以找到它们……不过,将它们放入 C++ 库可能会稍微困难一些。
【讨论】: