2

我正在创建一个移动应用程序(Android 和 iPhone)并计划要求客户端 SSL 身份验证。为此,我的应用程序包含了它的客户端证书文件。在 Android 端,这是一个包含私钥的密钥库。密钥库和密钥都有密码。

我的问题:我应该如何/在哪里将密码存储到密钥库和密钥?

在与服务器建立 SSL 连接时,应用程序代码需要这些才能打开密钥存储,因此应用程序需要能够访问它们。

是否应该将它们作为混淆字符串存储在应用程序源代码中?还是有一些我没有看到的更普遍接受(阅读:更好)的方法?

4

2 回答 2

1

用于保护密钥库的加密基于密码,因此您需要 (1) 将该密码存储在客户端的某个位置,或者 (2) 在用户启动客户端应用程序时询问用户密码。您需要做什么取决于您的用例。如果 (2) 是可以接受的,那么您已经保护了您的凭证免受逆向工程,因为它将被加密并且密码不会存储在任何地方(但用户每次都需要输入)。如果您这样做(1),那么有人将能够对您的客户端进行逆向工程,获取密码,获取密钥库,解密私钥和证书,并创建另一个能够连接到服务器的客户端 - 这是真的无论您将此密码存储在何处(在已编译的应用程序代码中,作为 APK/包中的资源,在 SharedPreference 中,在数据库等中;它仍然存在,并且会以某种形式存在,在某些时候它是可以理解的。

您无法采取任何措施来防止这种情况发生;你可以使你的代码更难逆向工程(通过混淆等),但你不能让它变得不可能。您需要确定使用这些方法试图减轻的风险是什么,以及需要做多少工作来减轻风险。

于 2012-04-24T17:08:04.350 回答
0

根据http://developer.android.com/guide/topics/data/data-storage.html

您“应该”在 Android 中使用 SharedPreferences 或简单的 SQLite 数据库。

我更喜欢 SQLite 方法,因为 iOS 也支持这种方法,因此您可以重用一些代码。

于 2012-04-24T15:31:34.637 回答