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をソースにしちゃったので、削除してもう一度書きました。
正直な話、対処法をどうしようかと考えているので
分かる方ご教授いただけると嬉しいです。