【问题标题】:how/where to store keystore password when using client side ssl authentication?使用客户端 ssl 身份验证时如何/在哪里存储密钥库密码?
【发布时间】:2012-04-24 15:26:50
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android iphone security mobile ssl


    【解决方案1】:

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

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

    【讨论】:

    • 我要问的是如何存储密码。选项1。我意识到从应用程序中获取密码永远是不可能的,即使它是由代码生成的。我要问的是,“在应用程序中混淆密码的‘最佳’方法是什么。”鉴于我不能让它成为不可能,有没有办法让它“最困难”?
    • 好吧,把它放在你的应用程序代码中,然后通过一个非常好的混淆过程/工具运行它(你的整个客户端应用程序)可能是你在这里可以做的“最好”的事情。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      • 2015-09-03
      • 1970-01-01
      • 2010-12-20
      • 2016-06-07
      • 2012-08-31
      相关资源
      最近更新 更多