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

我正在开发一个应用程序,用户需要login才能执行操作…但主要是在android手机上使用“保持我login”…在这种情况下,我将不得不维护用户名和密码的价值我的应用程序..我应该使用首选项,或SQLite DB或有其他东西,我怎样才能使它的安全? Plz帮助…在此先感谢..

Solutions Collecting From Web of "在Android应用程序中存储用户名和密码的最佳select"

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

我之前使用过的一个解决scheme是让服务器生成一个“票据”,并将其传递回设备,这在一段时间内是有益的。 这张票被设备用于所有的通信,当然使用SSL,所以人们不能窃取你的票。 这样,用户在服务器上validation其密码一次,服务器发回过期的故​​障单,密码永远不会存储在设备上的任何位置。

几个三方authentication机制,如OpenID,Facebook甚至Google API都使用这种机制。 缺点是每隔一段时间,当票证到期时,用户需要重新login。

最终,这取决于你想要你的应用程序有多安全。 如果这只是为了区分用户,并没有像银行账户或血型那样存储超级秘密信息,那么也许在设备上以明文保存pwd就好了:)

祝你好运,无论你决定什么方法最适合你的特定情况!

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

正如其他人所说,没有安全的方式来存储在Android的密码,充分保护数据。 散列/encryption密码是一个好主意,但它只会减慢“破解者”的速度。

就这样说,这就是我所做的:

1)我使用了这个simplecryto.java类 ,它接受一个种子和一个文本并encryption它。 2)我在私人模式下使用SharedPreferences来保护非根设备中保存的文件。 3)我用于simplecryto的种子是一个字节数组,比反编译器有点难以find反编译器。

我的应用程序最近由我公司雇用的“白帽子”安全组进行审查。 他们标记了这个问题,并表示我应该使用OAUTH,但他们也把它列为低风险问题,这意味着它不是很好,但不足以防止释放。

请记住,“破解者”将需要物理访问设备,并根据它和足够的关注find种子。

如果你真的关心安全,不要有“保持login状态”选项。

至less,将其存储在SharedPreferences (私有模式)中,不要忘记散列密码。 虽然这不会对恶意用户(或根植设备)产生影响,但是这是事实。

在不危及安全的情况下,最安全的做法是使用共享偏好来存储最后一个login人员的用户名。

另外,在你的用户表中,引入一个保存数字布尔值(1或0)的列来表示用户是否选中了“记住我”checkbox。

启动应用程序时,使用getSharedPreferences()函数获取用户名,并使用它来查询托pipe数据库,以查看signedin列是否为1或0,其中1表示已选中“记住我”checkbox。

  //encode password pass_word_et = (EditText) v.findViewById(R.id.password_et); String pwd = pass_word_et.getText().toString(); byte[] data = new byte[0]; try { data = pwd.getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } String base64 = Base64.encodeToString(data, Base64.DEFAULT); hbha_pref_helper.saveStringValue("pass_word", base64); //decode password String base64=hbha_pref_helper.getStringValue("pass_word"); byte[] data = Base64.decode(base64, Base64.DEFAULT); String decrypt_pwd=""; try { decrypt_pwd = new String(data, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); }