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).
kna*_*aak 24
正如其他人所说,没有安全的方法可以在Android中存储密码,从而完全保护数据.散列/加密密码是个好主意,但它只会减慢"破解者"的速度.
话虽如此,这就是我所做的:
1)我使用这个simplecryto.java类,它接受种子和文本并加密它.2)我SharedPreferences在私有模式下使用,它保护非root设备中保存的文件.3)我用于simplecryto的种子是一个字节数组,反编译器比String更难找到.
我的申请最近由我公司聘请的"白帽"安全小组审核.他们标记了这个问题,并表示我应该使用OAUTH,但他们也将其列为低风险问题,这意味着它不是很好,但还不足以阻止发布.
请记住,"破解者"需要对设备进行物理访问并对其进行根据并且足够小心地找到种子.
如果您真的关心安全性,请不要"保持登录状态"选项.
至少,将其存储在SharedPreferences(私有模式)中,不要忘记哈希密码.虽然这对恶意用户(或有根设备)没有什么影响,但它确实存在.
您可以使用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)