在Android应用中存储用户名和密码

时间:2016-03-31 13:24:21

标签: android security authentication

我需要在我的Android应用中存储用户凭据。应用程序将HTTP请求发送到服务器,凭据用于对该服务器进行身份验证。

我知道很多文章和关于这个主题的讨论已经存在。但是,考虑到以下具体要求,我想请求帮助:

  • 应该要求用户输入一次用户名和密码。之后,应用程序必须能够永久地与服务器进行身份验证。
  • 如果服务器收到包含用户名和密码的身份验证请求,它会生成一个随机令牌并将其发送回客户端。
  • 客户端必须将令牌添加到其他请求(作为HTTP标头)。
  • 令牌的有效期始终在生成后一小时到期。客户端必须使用用户名和密码发送另一个身份验证请求以获取新令牌。

请注意,服务器提供的自定义身份验证机制不遵循任何标准。

我想说这些是非常强大的要求,它们已经影响了一些安全问题。但是,我们假设这些条件无法更改,Android应用必须满足这些条件。

以下是我要做的事情:

  • 由于用户每次安装应该只提供一次凭据,并且由于服务器端的令牌的有效性有限,并且客户端必须一次又一次地使用凭据重新进行身份验证,因此Android应用无法避免存储密码。 / LI>
  • 我会将凭据存储到DB中(通过从SQLiteOpenHelper包中继承android.database.sqlite)。
  • 我会在存储凭据之前加密凭据,但用于加密/解密的密钥只是应用程序中的一个常量硬编码。
  • 此外,我会在清单文件中将android:allowBackup设置为false并对应用程序进行模糊处理。

我知道有物理访问设备的攻击者可以获取凭据。我也知道,一些建议的步骤对于这样的攻击者来说只是一个小障碍。

但是,如果在问题开头提到要求,我还能做些什么来提高安全性?

感谢。

1 个答案:

答案 0 :(得分:1)

如果我在你的位置,我会使用SQLCipher来存储用户凭据。这是一种创建和使用加密(使用AES)sqlite数据库的简单方法,而且麻烦极少。

当然,这并不能解决整个问题。您仍然需要一种安全的方法来生成/存储所述数据库的密钥。如果我推荐任何选项,我建议要求用户在打开应用程序时输入密码/ PIN,并使用所述密码/ PIN作为数据库密钥。

另一种方法是在应用安装后生成唯一的随机密钥,并将其存储在the Android Keystore中。真正专注/资金充足的攻击者仍然可以检索密钥,但仅限于该设备上的数据库。