在帐户管理器的用户数据是由其他应用程序访问

问题描述 投票:3回答:2

我想利用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字符串的区别?

android security sharedpreferences account accountmanager
2个回答
0
投票

从文档的AccountManager:

这个类提供了访问用户的在线账户的集中注册。用户输入凭据(用户名和密码),每个帐户一次,授予应用程序访问网络资源,“一键式”审批。

由的AccountManager托管账户集中和可重复使用的,例如所有的谷歌应用程序可以使用相同的账户,而不是每一个应用程序都必须创建自己的谷歌账户。

所以AccountManager的理念之一,据我了解,是有可重复使用的账户,从不同的应用程序访问。

但随着存储的证书是从不同的地方访问,你不应该存储在任何的AccountManager明文密码。

也许这个话题很有趣你:What should I use AccountManager for?


0
投票

如果你的数据是个人数据,你可以对其进行加密,所以没有其他应用可以读取它们。

即使用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

© www.soinside.com 2019 - 2024. All rights reserved.