如何在APK文件中保护SFTP密码

4
我正在开发一款Android应用程序,其中包含一个上传图像/文件到FTP服务器的服务。
为了实现这一点,设备上的应用程序必须在发送数据之前登录到FTP服务器。
这就是我的问题所在。用户不需要/不必知道FTP登录数据。只有应用程序本身需要。我必须将登录数据存储在Java类中。但我该如何保护用户名和密码?
我可以对其进行加密或混淆。但我认为黑客在JVM调用“setPassword(passwordString)”方法时可能会在运行时读取密码:
String passwordString = "myPass";

JSch ssh = new JSch();
session = ssh.getSession(SFTP_USER, HOST_ADDRESS, 22);
session.setPassword(passwordString);

所以我该如何将我的凭据存储在APK文件中并确保安全?我不希望任何人能够访问我的FTP服务器。

1个回答

8
我该如何将我的凭据存储在APK文件中并确保安全?我不希望任何人可以访问我的FTP服务器。
这个问题无法解决。
无论你的混淆技巧有多聪明,如果你在APK文件中隐藏固定凭据,那么分析你的应用程序的人就会找到它们。
如果你从这个答案中只学到一件事,那就是对于你的服务器来说,单一静态密码极为问题复杂,因为你永远无法在服务器端更改密码,因为这样会破坏所有应用程序。你的密码很快就会成为公共知识,而你将无能为力。
任何合理的方法都需要为每个用户提供单独的访问凭据。
传统的用户注册系统涉及确认电子邮件是一个相当好的方法。你可以使用像Google+登录或Facebook Connect之类的东西来最大程度地减少最终用户的麻烦。
如果您坚持不让用户进行任何交互,一种可能有效的方法是让应用程序注册Google Cloud Messaging,然后发送包含访问凭据的推送通知,应用程序将在KeyChain中存储这些凭据。
如果为每个应用程序安装生成唯一的用户ID和密码,则可以监视服务器并阻止任何滥用访问凭据而不影响其他用户。如果以某种方式将APK文件的代码签名身份纳入到该过程中,则可以基本防御人们重新打包您的应用程序。这种方法不能保护您免受智能攻击者的攻击,但可能会提高您的目的的门槛。
此外,无论您做什么,请务必正确验证您的服务器的SSL证书。如果不这样做,攻击者将简单地通过代理服务器运行您的连接。

1
嘿,谢谢你的回答。非常有帮助。不幸的是,我已经假定在apk中没有隐藏ftp密码的方法。我正在考虑的是在应用程序和FTP之间添加一个PHP接口。PHP将接受所有上传,但只会将那些通过Google IN-APP购买ID验证为已支付的上传转发到FTP。你对这种方法有什么看法? - Devalex
在将上传内容放入永久存储之前进行验证似乎是个不错的主意。 - Barend

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接