我想利用Android的客户经理来存储用户的应用程序凭据。虽然我不保存用户的密码,我想其他的安全密钥保存到帐户的UserData。根据下面引用的文件,这不应该用不同的UID应用程序访问。
公共字符串getUserData(客户账户,串键)
通过获取与账户相关联的“钥匙”命名的用户数据。这是用于认证设备和相关的代码存储任意元数据与账户一起。键和值的含义是高达认证的帐户。
它是安全地调用从主线程此方法。
这种方法需要调用者持有许可AUTHENTICATE_ACCOUNTS,并有相同的UID作为帐号的身份验证。
参数帐户 - 查询用户数据的帐户返回用户数据,NULL,如果帐户或键不存在
为了验证这一点,我创建了创建一个帐户,有些内容保存到的UserData的应用程序。我还创建了访问第一个应用程序的账户另一种应用。下面是摘录:
第一个应用程序:
AccountManager am = (AccountManager) context.getSystemService(Context.ACCOUNT_SERVICE);
final Account account = new Account("Account Name", "my.account.type");
am.addAccountExplicitly(account, null, null);
am.setAuthToken(account, "my.account.type", "some auth token");
am.setUserData(account, "key.for.secure.user.data", "some secure data");
第二个应用:
AccountManager am = (AccountManager)context.getSystemService(Context.ACCOUNT_SERVICE);
Account[] accountsFromFirstApp = am.getAccountsByType("my.account.type");
for(Account acct: accountsFromFirstApp){
printToLogs(acct.name);
printToLogs(am.getUserData(acct, "key.for.secure.user.data"));
}
根据上述文件,我希望第二个应用程序的getUserData()返回一个异常不具有相同的UID作为所有者的应用程序。出人意料的是,我能够没有错误访问第一个应用程序的用户数据。
但是,当我试图通过使用“com.google”作为ACCOUNTTYPE从谷歌访问帐户,我得到了预期的异常。
有什么错我的执行?我错过了一些配置,这不是Android的文档中所述?任何帮助将是非常赞赏。
在第二个想法,如果这些用户数据刚好可以轻松访问的(假设其他应用程序知道我的应用程序的帐户类型),然后就是从SharedPreferences存储他们,而不是存储的UserData字符串的区别?
从文档的AccountManager:
这个类提供了访问用户的在线账户的集中注册。用户输入凭据(用户名和密码),每个帐户一次,授予应用程序访问网络资源,“一键式”审批。
由的AccountManager托管账户集中和可重复使用的,例如所有的谷歌应用程序可以使用相同的账户,而不是每一个应用程序都必须创建自己的谷歌账户。
所以AccountManager的理念之一,据我了解,是有可重复使用的账户,从不同的应用程序访问。
但随着存储的证书是从不同的地方访问,你不应该存储在任何的AccountManager明文密码。
也许这个话题很有趣你:What should I use AccountManager for?
如果你的数据是个人数据,你可以对其进行加密,所以没有其他应用可以读取它们。
即使用AES加密这样的:
public class AESCryptor
{
private static final String ALGORITHM = "AES";
// 16-bit Key for encryption (Change to yours)
private static final String KEY = "XXXXXXXXXXXXXXX";
public static String encrypt(String value) throws Exception
{
Key key = generateKey();
@SuppressLint("GetInstance") Cipher cipher = Cipher.getInstance(AESCryptor.ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, key);
byte [] encryptedByteValue = cipher.doFinal(value.getBytes("utf-8"));
return Base64.encodeToString(encryptedByteValue, Base64.DEFAULT);
}
public static String decrypt(String value) throws Exception
{
Key key = generateKey();
@SuppressLint("GetInstance") Cipher cipher = Cipher.getInstance(AESCryptor.ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decryptedValue64 = Base64.decode(value, Base64.DEFAULT);
byte [] decryptedByteValue = cipher.doFinal(decryptedValue64);
return new String(decryptedByteValue,"utf-8");
}
private static Key generateKey() {
return new SecretKeySpec(AESCryptor.KEY.getBytes(),AESCryptor.ALGORITHM);
}
}
我用它在我的应用程序,和它的作品!
这也许不回答这个问题
在帐户管理器的用户数据是由其他应用程序访问
但其通过@托马斯-S-E回答
问候,@developerfromjokela