簡體   English   中英

我們可以從Android Keystore中提取公鑰/私鑰嗎?

[英]Can we extract public/private keys from the Android Keystore?

關於Android Keystore系統文章,

關鍵材料永遠不會進入申請流程。 當應用程序使用Android密鑰庫密鑰執行加密操作時,在幕后明文,密文和要簽名或驗證的消息被饋送到執行加密操作的系統進程。 如果應用程序的進程受到攻擊,攻擊者可能能夠使用應用程序的密鑰但無法提取其密鑰材料(例如,要在Android設備之外使用)

所以,我的問題是為什么在BasicAndroidKeyStore中 ,開發人員能夠獲取KeyPair對象然后打印其公鑰/私鑰

如果開發人員可以訪問密鑰,那么如何認為該系統是安全的? 不是。 如果攻擊者破壞了應用程序進程,他可以輕松地檢索kays並在設備外部使用。

您從BasicAndroidKeyStore指向的示例代碼不記錄公鑰,因為來自KeyPair類的getPublic()僅返回公鑰對象的引用,而不是公鑰本身。

Log.d(TAG, "Public Key reference is: " + kp.getPublic().toString());

日志:

D / KeyStoreFragment:公鑰引用是:android.security.keystore.AndroidKeyStoreRSAPublicKey@b8004e8f

getPrivate()也是如此

Log.d(TAG, "Private Key reference is: " + kp.getPrivate().toString());

日志:

D / KeyStoreFragment:私鑰引用是android.security.keystore.AndroidKeyStoreRSAPrivateKey@5da42c27


現在,正如您在評論中指出的那樣, kp.getPublic().getEncoded()將返回實際的公鑰,但公鑰的初始目的並不是秘密。

私鑰是秘密的,當使用硬件支持的密鑰庫以及設備安全硬件支持的密鑰時,密鑰安全地存儲在TEE / SE中,並且不能由應用程序本身或其他具有root的壞操作者提取特權。 您可以在此示例中看到它:

Log.d(TAG, "Private Key is " + Arrays.toString(kp.getPrivate().getEncoded()));

日志:

D / KeyStoreFragment:私鑰為空


要驗證設備的安全硬件是否支持您的密鑰,您可以使用此代碼的某些變體來滿足您的需求。 您可以在示例應用程序的createKeys()方法中將此片段粘貼到上面提到的相同Log.d之后。

    KeyFactory factory = KeyFactory.getInstance(kp.getPrivate().getAlgorithm(), "AndroidKeyStore");
    KeyInfo keyInfo = null;
    try {
        keyInfo = factory.getKeySpec(kp.getPrivate(), KeyInfo.class);
    } catch (InvalidKeySpecException e) {
        e.printStackTrace();
    }
    if (keyInfo.isInsideSecureHardware())
        Log.d(TAG, "Key is supported in secure hardware");
    else
        Log.d(TAG, "Key is not supported in secure hardware");

暫無
暫無

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

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