LoginSignup
2
0

More than 5 years have passed since last update.

AndroidKeyStoreSystemのisInsideSecureHardwareがfalseになる時

Last updated at Posted at 2018-05-25

isInsideSecureHardware

Androidの鍵がハードウェア内の安全な領域に保存されているかどうか調べるAPIです。
実装時に使用していたGalaxyでは、問題なかったため以前記事にした
実装方法で良いと思っていたのですが、一部の端末を使用すると
上記APIがfalseが帰って来ますと報告受けたので調べてみました。

確認した端末

Androidは端末多すぎ定期なので、以下の端末に絞ってみました。
GalaxyS6Edge
Priori4
XperiaZ3Compact
VAIOPhoneA

実際のソース

確認のためのソース

try {
            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
            keyStore.load(null);
            SecretKey secretKey = (SecretKey)keyStore.getKey(AES_ALIAS,null);
            SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(KeyProperties.KEY_ALGORITHM_AES,"AndroidKeyStore");
            KeyInfo keyInfo = (KeyInfo)secretKeyFactory.getKeySpec(secretKey,KeyInfo.class);
            if(keyInfo.isInsideSecureHardware()) {
                return true;
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (CertificateException e) {
            e.printStackTrace();
        } catch (UnrecoverableKeyException e) {
            e.printStackTrace();
        } catch (KeyStoreException e) {
            e.printStackTrace();
        } catch (InvalidKeySpecException e) {
            e.printStackTrace();
        } catch (NoSuchProviderException e) {
            e.printStackTrace();
        }
        return false;

確認結果

GalaxyS6Edge true
Priori4 false
XperiaZ3Compact false
VAIOPhoneA true

なんで端末によって、結果が違うのか

冒頭に説明した通り「isInsideSecureHardware」は

鍵がハードウェア内の安全な領域に保存されているかどうか調べる

結果をいうと、CPUの種類によって発生するようです。
https://developer.android.com/training/articles/keystore
こちらの抽出の防止に以下の様な記述があります。

キーマテリアルを Android 端末の安全なハードウェア(たとえば、Trusted Execution Environment(TEE)や セキュア エレメント(SE))にバインドすることができます。キーに対してこの機能が有効化されていると、キーのキーマテリアルが安全なハードウェアの外部に露出されることはありません。

このTEEとは、ハードウェアの安全な領域にアクセスするためのAPIの様で
Android OSとは独立した領域です。
安全な領域は、CPUのアーキテクチャーの技術であり
そこからCPUによる差分なのではと思い、各端末のCPUを確認しました。

GalaxyS6Edge EXYNOS7420
http://www.samsung.com/semiconductor/minisite/exynos/products/mobileprocessor/exynos-7-octa-7420/
Priori4 MT6737
https://www.mediatek.jp/products/mt6737
XperiaZ3Compact Snapdragon 801
https://www.qualcomm.com/products/snapdragon/processors/801
VAIOPhoneA Snapdragon 617
https://www.qualcomm.com/products/snapdragon/processors/617

サイトを見てみると、trueになっているのは
ARM Cortex A53
が書いており、TrustZoneが実装されているCPUなら大丈夫だと思います。
(Priori4もA53なのですが、MT6737TはTEEに関する記事を見つけたので
もしかしたらMT6737では未実装?とか思っています。
https://www.mediatek.com/blog/mediatek-mt6737t-granted-globalplatform-tee-security-evaluation-product-certificate)

最後に

ちょっと前に同様の記事あげたのですが、理解が乏しかったのと
wikipediaをソースにしちゃったので、削除してもう一度書きました。
正直な話、対処法をどうしようかと考えているので
分かる方ご教授いただけると嬉しいです。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0