簡體   English   中英

其他應用程序可以訪問客戶經理中的用戶數據

[英]User data in account manager is accessible by other applications

我正在嘗試利用Android的帳戶管理器來存儲用戶的應用憑據。 雖然我沒有保存用戶的密碼,但我想將其他安全密鑰保存到帳戶的UserData中。 根據下面引用的文檔,具有不同UID的應用程序不應該訪問它。

public String getUserData(帳戶帳戶,字符串鍵)

獲取與帳戶關聯的“key”命名的用戶數據。 這適用於驗證者和相關代碼,用於存儲任意元數據和帳戶。 密鑰和值的含義取決於帳戶的驗證者。

從主線程調用此方法是安全的。

此方法要求調用者持有權限AUTHENTICATE_ACCOUNTS並具有與帳戶的身份驗證者相同的UID。

參數account - 要查詢用戶數據的帳戶返回用戶數據,如果帳戶或密鑰不存在,則為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”作為帳戶類型從谷歌訪問帳戶時,我得到了預期的異常。

我的實施有什么問題? 我是否錯過了Android文檔中未說明的配置? 任何幫助將非常感謝。

第二個想法,如果可以輕松訪問這些用戶數據(假設其他應用程序知道我的應用程序的帳戶類型),那么將UserData中的字符串存儲在SharedPreferences中的區別是什么?

從AccountManager文檔:

此類提供對用戶在線帳戶的集中注冊表的訪問。 用戶每個帳戶輸入一次憑據(用戶名和密碼),通過“一鍵”批准授予應用程序訪問在線資源的權限。

AccountManager管理的帳戶是集中且可重復使用的,例如,所有Google應用都可以使用相同的帳戶,並非每個應用都必須創建自己的Google帳戶。

因此,據我所知,AccountManager的一個想法是擁有可從不同應用程序訪問的可重用帳戶。

但由於可以從不同的位置訪問存儲的憑據,因此不應在AccountManager中存儲任何純文本密碼。

願這個主題對您有意義: 我應該使用AccountManager做什么?

如果您的數據是個人數據,則可以對其進行加密,因此其他任何應用都無法讀取它們。

IE使用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);
    }
}

我在我的應用程序中使用它,它的工作原理!

這可能沒有回答這個問題

其他應用程序可以訪問客戶經理中的用戶數據

但它由@ thomas-se回答

此致@developerfromjokela

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM