在Android应用程序中存储用户名和密码的最佳选择

Sau*_*wal 37 android android-preferences sharedpreferences android-sqlite

我正在开发一个应用程序,用户需要登录才能执行操作...但主要是在Android手机上使用"让我登录"......在这种情况下我将不得不维护用户名和密码的值我的应用程序......应该使用首选项,还是SQLite Db,还是有别的东西,我怎样才能使它安全?Plz帮助...在此先感谢..

Mik*_*ike 32

是的,这在Android上很棘手.您不希望将明文密码存储在首选项中,因为拥有root设备的任何人都将基本上向世界显示其密码.另一方面,您不能使用加密密码,因为您必须将加密/解密密钥存储在设备的某个位置,再次容易受到根攻击.

我曾经使用的一个解决方案是让服务器生成一个"票据",然后将其传递回设备,这在一段时间内是有益的.该票据由设备用于所有通信,当然使用SSL,因此人们无法窃取您的票.这样,用户在服务器上验证一次密码,服务器发回一张过期的票证,密码永远不会存储在设备上的任何地方.

几个三脚认证机制,如OpenID,Facebook,甚至谷歌API,都使用这种机制.缺点是每隔一段时间,当票证到期时,用户需要重新登录.

最终,它取决于您希望应用程序的安全性.如果这只是为了区分用户,并且没有像银行账户或血型那样存储超级机密信息,那么也许在设备上以明文方式保存pwd就可以了:)

祝你好运,无论你决定哪种方法最适合你的特殊情况!

编辑:我应该注意,这种技术将安全责任转移到服务器 - 您将希望使用盐水哈希在服务器上进行密码比较,这个想法你会在这个问题的其他一些评论中看到.这可以防止明文密码出现在除设备上的EditText View,服务器的SSL通信以及服务器的RAM(除盐和哈希密码)之外的任何地方.它永远不会存储在磁盘上,这是一件好事(tm).

  • 我同意你在技术上说的一切.但我觉得你的血型越公开,在紧急情况下你就越有可能得救;) (4认同)
  • 如果数据不是超级机密并不重要,用户可以在许多地方使用相同的用户/密码,攻击者可以获取这些数据并尝试不同的服务. (2认同)

kna*_*aak 24

正如其他人所说,没有安全的方法可以在Android中存储密码,从而完全保护数据.散列/加密密码是个好主意,但它只会减慢"破解者"的速度.

话虽如此,这就是我所做的:

1)我使用这个simplecryto.java,它接受种子和文本并加密它.2)我SharedPreferences在私有模式下使用,它保护非root设备中保存的文件.3)我用于simplecryto的种子是一个字节数组,反编译器比String更难找到.

我的申请最近由我公司聘请的"白帽"安全小组审核.他们标记了这个问题,并表示我应该使用OAUTH,但他们也将其列为低风险问题,这意味着它不是很好,但还不足以阻止发布.

请记住,"破解者"需要对设备进行物理访问并对其进行根据并且足够小心地找到种子.

如果您真的关心安全性,请不要"保持登录状态"选项.


Mar*_*nto 7

至少,将其存储在SharedPreferences(私有模式)中,不要忘记哈希密码.虽然这对恶意用户(或有根设备)没有什么影响,但它确实存在.

  • @androniennn有一个关于如何散列密码的_ton_教程,所以我会告诉你谷歌.要记住的一件事是,散列只是为了阻止_casual_窥探者.当设备植根时(例如),此技术**无效**,恶意用户也可以访问您的二进制文件.想想看,如果有人可以对你的程序进行逆向工程,那么他们就可以很容易地找出你的密码.你只需要知道所有的可能性:) (2认同)

Cli*_*max 6

您可以使用Jetpack 安全库中的EncryptedSharedPreferences 。它非常适合键值类型设置。

它包装SharedPreferences,提供安全的加密/解密,同时保持与SharedPreferences.

正如他们的例子:

  String masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC);

  SharedPreferences sharedPreferences = EncryptedSharedPreferences.create(
      "secret_shared_prefs",
      masterKeyAlias,
      context,
      EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
      EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
  );

  // use the shared preferences and editor as you normally would
  SharedPreferences.Editor editor = sharedPreferences.edit();
Run Code Online (Sandbox Code Playgroud)