* changes: Remove links to createAndInitializeUser() and createUser() Resolve merge conflicts of a5060ee to nyc-dev
679 lines
22 KiB
Plaintext
679 lines
22 KiB
Plaintext
page.title=Android Keystore System
|
|
@jd:body
|
|
|
|
<div id="tb-wrapper">
|
|
<div id="tb">
|
|
<h2>In this document</h2>
|
|
<ol>
|
|
<li><a href="#SecurityFeatures">Security Features</a></li>
|
|
<li><a href="#WhichShouldIUse">Choosing Between a Keychain or the Android Keystore Provider</a></li>
|
|
<li><a href="#UsingAndroidKeyStore">Using Android Keystore Provider</a>
|
|
<ol>
|
|
<li><a href="#GeneratingANewPrivateKey">Generating a New Private Key</a></li>
|
|
<li><a href="#WorkingWithKeyStoreEntries">Working with Keystore Entries</a></li>
|
|
<li><a href="#ListingEntries">Listing Entries</a></li>
|
|
<li><a href="#SigningAndVerifyingData">Signing and Verifying Data</a></li>
|
|
</ol>
|
|
</li>
|
|
<li><a href="#SupportedAlgorithms">Supported Algorithms</a></li>
|
|
</ol>
|
|
|
|
<h2>Blog articles</h2>
|
|
<ol>
|
|
<li><a
|
|
href="http://android-developers.blogspot.com/2012/03/unifying-key-store-access-in-ics.html">
|
|
<h4>Unifying Key Store Access in ICS</h4>
|
|
</a></li>
|
|
</ol>
|
|
</div>
|
|
</div>
|
|
|
|
<style type="text/css">
|
|
tr.deprecated {
|
|
background-color: #ccc;
|
|
color: #999;
|
|
font-style: italic;
|
|
}
|
|
</style>
|
|
|
|
<p>The Android Keystore system lets you store cryptographic keys in a container
|
|
to make it more difficult to extract from the device. Once keys are in the
|
|
keystore, they can be used for cryptographic operations with the key material
|
|
remaining non-exportable. Moreover, it offers facilities to restrict when and
|
|
how keys can be used, such as requiring user authentication for key use or
|
|
restricting keys to be used only in certain cryptographic modes. See
|
|
<a href="#SecurityFeatures">Security Features</a> section for more information.</p>
|
|
|
|
<p>The Keystore system is used by the {@link
|
|
android.security.KeyChain} API as well as the Android
|
|
Keystore provider feature that was introduced in Android 4.3
|
|
(API level 18). This document goes over when and how to use the
|
|
Android Keystore provider.</p>
|
|
|
|
|
|
<h2 id="SecurityFeatures">Security Features</h2>
|
|
|
|
Android Keystore system protects key material from unauthorized use. Firstly, Android Keystore
|
|
mitigates unauthorized use of key material outside of the Android device by preventing extraction of
|
|
the key material from application processes and from the Android device as a whole. Secondly,
|
|
Android KeyStore mitigates unauthorized use of key material on the Android device by making apps
|
|
specify authorized uses of their keys and then enforcing these restrictions outside of the apps'
|
|
processes.
|
|
|
|
<h3 id="ExtractionPrevention">Extraction Prevention</h3>
|
|
|
|
Key material of Android Keystore keys is protected from extraction using two security measures:
|
|
<ul>
|
|
<li>Key material never enters the application process. When an application performs cryptographic
|
|
operations using an Android Keystore key, behind the scenes plaintext, ciphertext, and messages to
|
|
be signed or verified are fed to a system process which carries out the cryptographic operations.
|
|
If the app's process is compromised, the attacker may be able to use the app's keys but will not
|
|
be able to extract their key material (for example, to be used outside of the Android device).
|
|
</li>
|
|
<li>Key material may be bound to the secure hardware (e.g., Trusted Execution Environment (TEE),
|
|
Secure Element (SE)) of the Android device. When this feature is enabled for a key, its key
|
|
material is never exposed outside of secure hardware. If the Android OS is compromised or an
|
|
attacker can read the device's internal storage, the attacker may be able to use any app's Android
|
|
Keystore keys on the Android device, but not extract them from the device. This feature is enabled
|
|
only if the device's secure hardware supports the particular combination of key algorithm, block
|
|
modes, padding schemes, and digests with which the key is authorized to be used. To check whether
|
|
the feature is enabled for a key, obtain a {@link android.security.keystore.KeyInfo} for the key
|
|
and inspect the return value of
|
|
{@link android.security.keystore.KeyInfo#isInsideSecureHardware() KeyInfo.isInsideSecurityHardware()}.
|
|
</li>
|
|
</ul>
|
|
|
|
<h3 id="KeyUseAuthorizations">Key Use Authorizations</h3>
|
|
|
|
To mitigate unauthorized use of keys on the Android device, Android Keystore lets apps specify
|
|
authorized uses of their keys when generating or importing the keys. Once a key is generated or
|
|
imported, its authorizations can not be changed. Authorizations are then enforced by the Android
|
|
Keystore whenever the key is used. This is an advanced security feature which is generally useful
|
|
only if your requirements are that a compromise of your application process after key
|
|
generation/import (but not before or during) cannot lead to unauthorized uses of the key.
|
|
|
|
<p>Supported key use authorizations fall into the following categories:
|
|
<ul>
|
|
<li><em>cryptography</em>: authorized key algorithm, operations or purposes (encrypt, decrypt, sign,
|
|
verify), padding schemes, block modes, digests with which the key can be used;</li>
|
|
<li><em>temporal validity interval</em>: interval of time during which the key is authorized for
|
|
use;</li>
|
|
<li><em>user authentication</em>: the key can only be used if the user has been authenticated
|
|
recently enough. See <a href="#UserAuthentication">Requiring User Authentication For Key Use</a>.
|
|
</li>
|
|
</ul>
|
|
|
|
<p>As an additional security measure, for keys whose key material is inside secure hardware (see
|
|
{@link android.security.keystore.KeyInfo#isInsideSecureHardware() KeyInfo.isInsideSecurityHardware()})
|
|
some key use authorizations may be enforced by secure hardware, depending on the Android device.
|
|
Cryptographic and user authentication authorizations are likely to be enforced by secure hardware.
|
|
Temporal validity interval authorizations are unlikely to be enforced by the secure hardware
|
|
because it normally does not have an independent secure real-time clock.
|
|
|
|
<p>Whether a key's user authentication authorization is enforced by the secure hardware can be
|
|
queried using
|
|
{@link android.security.keystore.KeyInfo#isUserAuthenticationRequirementEnforcedBySecureHardware() KeyInfo.isUserAuthenticationRequirementEnforcedBySecureHardware()}.
|
|
|
|
<h2 id="WhichShouldIUse">Choosing Between a Keychain or the
|
|
Android Keystore Provider</h2>
|
|
|
|
<p>Use the {@link android.security.KeyChain} API when you want
|
|
system-wide credentials. When an app requests the use of any credential
|
|
through the {@link android.security.KeyChain} API, users get to
|
|
choose, through a system-provided UI, which of the installed credentials
|
|
an app can access. This allows several apps to use the
|
|
same set of credentials with user consent.</p>
|
|
|
|
<p>Use the Android Keystore provider to let an individual app store its own
|
|
credentials that only the app itself can access.
|
|
This provides a way for apps to manage credentials that are usable
|
|
only by itself while providing the same security benefits that the
|
|
{@link android.security.KeyChain} API provides for system-wide
|
|
credentials. This method requires no user interaction to select the credentials.</p>
|
|
|
|
<h2 id="UsingAndroidKeyStore">Using Android Keystore Provider</h2>
|
|
|
|
<p>
|
|
To use this feature, you use the standard {@link java.security.KeyStore}
|
|
and {@link java.security.KeyPairGenerator} or
|
|
{@link javax.crypto.KeyGenerator} classes along with the
|
|
{@code AndroidKeyStore} provider introduced in Android 4.3 (API level 18).</p>
|
|
|
|
<p>{@code AndroidKeyStore} is registered as a {@link
|
|
java.security.KeyStore} type for use with the {@link
|
|
java.security.KeyStore#getInstance(String) KeyStore.getInstance(type)}
|
|
method and as a provider for use with the {@link
|
|
java.security.KeyPairGenerator#getInstance(String, String)
|
|
KeyPairGenerator.getInstance(algorithm, provider)} and {@link
|
|
javax.crypto.KeyGenerator#getInstance(String, String)
|
|
KeyGenerator.getInstance(algorithm, provider)} methods.</p>
|
|
|
|
<h3 id="GeneratingANewPrivateKey">Generating a New Private Key</h3>
|
|
|
|
<p>Generating a new {@link java.security.PrivateKey} requires that
|
|
you also specify the initial X.509 attributes that the self-signed
|
|
certificate will have. You can use
|
|
{@link java.security.KeyStore#setKeyEntry(String, java.security.Key, char[], java.security.cert.Certificate[]) KeyStore.setKeyEntry}
|
|
to replace the certificate at a later time with a certificate signed
|
|
by a Certificate Authority (CA).</p>
|
|
|
|
<p>To generate the key, use a {@link java.security.KeyPairGenerator}
|
|
with {@link android.security.KeyPairGeneratorSpec}:</p>
|
|
|
|
{@sample development/samples/ApiDemos/src/com/example/android/apis/security/KeyStoreUsage.java generate}
|
|
|
|
<h3 id="GeneratingANewSecretKey">Generating a New Secret Key</h3>
|
|
|
|
<p>To generate the key, use a {@link javax.crypto.KeyGenerator} with
|
|
{@link android.security.keystore.KeyGenParameterSpec}.
|
|
|
|
<h3 id="WorkingWithKeyStoreEntries">Working with Keystore Entries</h3>
|
|
|
|
<p>Using the {@code AndroidKeyStore} provider takes place through
|
|
all the standard {@link java.security.KeyStore} APIs.</p>
|
|
|
|
<h4 id="ListingEntries">Listing Entries</h4>
|
|
|
|
<p>List entries in the keystore by calling the {@link
|
|
java.security.KeyStore#aliases()} method:</p>
|
|
|
|
{@sample development/samples/ApiDemos/src/com/example/android/apis/security/KeyStoreUsage.java list}
|
|
|
|
<h4 id="SigningAndVerifyingData">Signing and Verifying Data</h4>
|
|
|
|
<p>Sign data by fetching the {@link
|
|
java.security.KeyStore.Entry} from the keystore and using the
|
|
{@link java.security.Signature} APIs, such as {@link
|
|
java.security.Signature#sign()}:</p>
|
|
|
|
{@sample development/samples/ApiDemos/src/com/example/android/apis/security/KeyStoreUsage.java sign}
|
|
|
|
<p>Similarly, verify data with the {@link java.security.Signature#verify(byte[])} method:</p>
|
|
|
|
{@sample development/samples/ApiDemos/src/com/example/android/apis/security/KeyStoreUsage.java verify}
|
|
|
|
<h3 id="UserAuthentication">Requiring User Authentication For Key Use</h3>
|
|
|
|
<p>When generating or importing a key into the {@code AndroidKeyStore} you can specify that the key
|
|
is only authorized to be used if the user has been authenticated. The user is authenticated using a
|
|
subset of their secure lock screen credentials (pattern/PIN/password, fingerprint).
|
|
|
|
<p>This is an advanced security feature which is generally useful only if your requirements are that
|
|
a compromise of your application process after key generation/import (but not before or during)
|
|
cannot bypass the requirement for the user to be authenticated to use the key.
|
|
|
|
<p>When a key is authorized to be used only if the user has been authenticated, it is configured to
|
|
operate in one of the two modes:
|
|
<ul>
|
|
<li>User authentication authorizes the use of keys for a duration of time. All keys in this mode are
|
|
authorized for use as soon as the user unlocks the secure lock screen or confirms their secure
|
|
lock screen credential using the
|
|
{@link android.app.KeyguardManager#createConfirmDeviceCredentialIntent(CharSequence, CharSequence) KeyguardManager.createConfirmDeviceCredentialIntent}
|
|
flow. The duration for which the authorization remains valid is specific to each key, as specified
|
|
using {@code setUserAuthenticationValidityDurationSeconds} during key generation or import. Such
|
|
keys can only be generated or imported if the secure lock screen is enabled (see
|
|
{@link android.app.KeyguardManager#isDeviceSecure() KeyguardManager.isDeviceSecure()}). These keys
|
|
become permanently invalidated once the secure lock screen is disabled (reconfigured to None,
|
|
Swipe or other mode which does not authenticate the user) or forcibly reset (e.g. by a Device
|
|
Administrator).</li>
|
|
<li>User authentication authorizes a specific cryptographic operation associated with one key. In
|
|
this mode, each operation involving such a key must be individually authorized by the user.
|
|
Currently, the only means of such authorization is fingerprint authentication:
|
|
{@link android.hardware.fingerprint.FingerprintManager#authenticate(CryptoObject, CancellationSignal, int, AuthenticationCallback, Handler) FingerprintManager.authenticate}.
|
|
Such keys can only be generated or imported if at least one fingerprint is enrolled (see
|
|
{@link android.hardware.fingerprint.FingerprintManager#hasEnrolledFingerprints() FingerprintManager.hasEnrolledFingerprints}).
|
|
These keys become permanently invalidated once a new fingerprint is enrolled or all fingerprints
|
|
are unenrolled.</li>
|
|
</ul>
|
|
|
|
<h2 id="SupportedAlgorithms">Supported Algorithms</h2>
|
|
|
|
<ul>
|
|
<li><a href="#SupportedCiphers">{@code Cipher}</a></li>
|
|
<li><a href="#SupportedKeyGenerators">{@code KeyGenerator}</a></li>
|
|
<li><a href="#SupportedKeyFactories">{@code KeyFactory}</a></li>
|
|
<li><a href="#SupportedKeyPairGenerators">{@code KeyPairGenerator}</a></li>
|
|
<li><a href="#SupportedMacs">{@code Mac}</a></li>
|
|
<li><a href="#SupportedSignatures">{@code Signature}</a></li>
|
|
<li><a href="#SupportedSecretKeyFactories">{@code SecretKeyFactory}</a></li>
|
|
</ul>
|
|
|
|
<h3 id="SupportedCiphers">Cipher</h3>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Algorithm</th>
|
|
<th>Supported (API Levels)</th>
|
|
<th>Notes</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>AES/CBC/NoPadding</td>
|
|
<td>23+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>AES/CBC/PKCS7Padding</td>
|
|
<td>23+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>AES/CTR/NoPadding</td>
|
|
<td>23+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>AES/ECB/NoPadding</td>
|
|
<td>23+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>AES/ECB/PKCS7Padding</td>
|
|
<td>23+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>AES/GCM/NoPadding</td>
|
|
<td>23+</td>
|
|
<td>Only 12-byte long IVs supported.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>RSA/ECB/NoPadding</td>
|
|
<td>18+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>RSA/ECB/PKCS1Padding</td>
|
|
<td>18+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>RSA/ECB/OAEPWithSHA-1AndMGF1Padding</td>
|
|
<td>23+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>RSA/ECB/OAEPWithSHA-224AndMGF1Padding</td>
|
|
<td>23+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>RSA/ECB/OAEPWithSHA-256AndMGF1Padding</td>
|
|
<td>23+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>RSA/ECB/OAEPWithSHA-384AndMGF1Padding</td>
|
|
<td>23+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>RSA/ECB/OAEPWithSHA-512AndMGF1Padding</td>
|
|
<td>23+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>RSA/ECB/OAEPPadding</td>
|
|
<td>23+</td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<h3 id="SupportedKeyGenerators">KeyGenerator</h3>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Algorithm</th>
|
|
<th>Supported (API Levels)</th>
|
|
<th>Notes</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>AES</td>
|
|
<td>23+</td>
|
|
<td>Supported sizes: 128, 192, 256</td>
|
|
</tr>
|
|
<tr>
|
|
<td>HmacSHA1</td>
|
|
<td>23+</td>
|
|
<td>
|
|
<ul>
|
|
<li>Supported sizes: 8--1024 (inclusive), must be multiple of 8</li>
|
|
<li>Default size: 160</li>
|
|
<ul>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>HmacSHA224</td>
|
|
<td>23+</td>
|
|
<td>
|
|
<ul>
|
|
<li>Supported sizes: 8--1024 (inclusive), must be multiple of 8</li>
|
|
<li>Default size: 224</li>
|
|
<ul>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>HmacSHA256</td>
|
|
<td>23+</td>
|
|
<td>
|
|
<ul>
|
|
<li>Supported sizes: 8--1024 (inclusive), must be multiple of 8</li>
|
|
<li>Default size: 256</li>
|
|
<ul>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>HmacSHA384</td>
|
|
<td>23+</td>
|
|
<td>
|
|
<ul>
|
|
<li>Supported sizes: 8--1024 (inclusive), must be multiple of 8</li>
|
|
<li>Default size: 384</li>
|
|
<ul>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>HmacSHA512</td>
|
|
<td>23+</td>
|
|
<td>
|
|
<ul>
|
|
<li>Supported sizes: 8--1024 (inclusive), must be multiple of 8</li>
|
|
<li>Default size: 512</li>
|
|
<ul>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<h3 id="SupportedKeyFactories">KeyFactory</h3>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Algorithm</th>
|
|
<th>Supported (API Levels)</th>
|
|
<th>Notes</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>EC</td>
|
|
<td>23+</td>
|
|
<td>Supported key specs: {@link android.security.keystore.KeyInfo} (private key only),
|
|
{@link java.security.spec.ECPublicKeySpec} (public key only),
|
|
{@link java.security.spec.X509EncodedKeySpec} (public key only)
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>RSA</td>
|
|
<td>23+</td>
|
|
<td>Supported key specs: {@link android.security.keystore.KeyInfo} (private key only),
|
|
{@link java.security.spec.RSAPublicKeySpec} (public key only),
|
|
{@link java.security.spec.X509EncodedKeySpec} (public key only)
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<h3 id="SupportedKeyStoreKeys">KeyStore</h3>
|
|
KeyStore supports the same key types as
|
|
<a href="#SupportedKeyPairGenerators">{@code KeyPairGenerator}</a> and
|
|
<a href="#SupportedKeyGenerators">{@code KeyGenerator}</a>.
|
|
|
|
<h3 id="SupportedKeyPairGenerators">KeyPairGenerator</h3>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Algorithm</th>
|
|
<th>Supported (API Levels)</th>
|
|
<th>Notes</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr class="deprecated">
|
|
<td>DSA</td>
|
|
<td>19–22</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>EC</td>
|
|
<td>23+</td>
|
|
<td>
|
|
<ul>
|
|
<li>Supported sizes: 224, 256, 384, 521</li>
|
|
<li>Supported named curves: P-224 (secp224r1), P-256 (aka secp256r1 and prime256v1), P-384
|
|
(aka secp384r1), P-521 (aka secp521r1)</li>
|
|
</ul>
|
|
|
|
<p>Prior to API Level 23, EC keys can be generated using KeyPairGenerator of algorithm "RSA"
|
|
initialized {@link android.security.KeyPairGeneratorSpec} whose key type is set to "EC"
|
|
using {@link android.security.KeyPairGeneratorSpec.Builder#setKeyType(String)}. EC curve
|
|
name cannot be specified using this method -- a NIST P-curve is automatically chosen based
|
|
on the requested key size.
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>RSA</td>
|
|
<td>18+</td>
|
|
<td>
|
|
<ul>
|
|
<li>Supported sizes: 512, 768, 1024, 2048, 3072, 4096</li>
|
|
<li>Supported public exponents: 3, 65537</li>
|
|
<li>Default public exponent: 65537</li>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<h3 id="SupportedMacs">Mac</h3>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Algorithm</th>
|
|
<th>Supported (API Levels)</th>
|
|
<th>Notes</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>HmacSHA1</td>
|
|
<td>23+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>HmacSHA224</td>
|
|
<td>23+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>HmacSHA256</td>
|
|
<td>23+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>HmacSHA384</td>
|
|
<td>23+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>HmacSHA512</td>
|
|
<td>23+</td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<h3 id="SupportedSignatures">Signature</h3>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Algorithm</th>
|
|
<th>Supported (API Levels)</th>
|
|
<th>Notes</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>MD5withRSA</td>
|
|
<td>18+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>NONEwithECDSA</td>
|
|
<td>23+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>NONEwithRSA</td>
|
|
<td>18+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="deprecated">
|
|
<td>SHA1withDSA</td>
|
|
<td>19–22</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>SHA1withECDSA</td>
|
|
<td>19+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>SHA1withRSA</td>
|
|
<td>18+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>SHA1withRSA/PSS</td>
|
|
<td>23+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="deprecated">
|
|
<td>SHA224withDSA</td>
|
|
<td>20–22</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>SHA224withECDSA</td>
|
|
<td>20+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>SHA224withRSA</td>
|
|
<td>20+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>SHA224withRSA/PSS</td>
|
|
<td>23+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="deprecated">
|
|
<td>SHA256withDSA</td>
|
|
<td>19–22</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>SHA256withECDSA</td>
|
|
<td>19+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>SHA256withRSA</td>
|
|
<td>18+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>SHA256withRSA/PSS</td>
|
|
<td>23+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="deprecated">
|
|
<td>SHA384withDSA</td>
|
|
<td>19–22</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>SHA384withECDSA</td>
|
|
<td>19+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>SHA384withRSA</td>
|
|
<td>18+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>SHA384withRSA/PSS</td>
|
|
<td>23+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="deprecated">
|
|
<td>SHA512withDSA</td>
|
|
<td>19–22</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>SHA512withECDSA</td>
|
|
<td>19+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>SHA512withRSA</td>
|
|
<td>18+</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>SHA512withRSA/PSS</td>
|
|
<td>23+</td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<h3 id="SupportedSecretKeyFactories">SecretKeyFactory</h3>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Algorithm</th>
|
|
<th>Supported (API Levels)</th>
|
|
<th>Notes</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>AES</td>
|
|
<td>23+</td>
|
|
<td>Supported key specs: {@link android.security.keystore.KeyInfo}</td>
|
|
</tr>
|
|
<tr>
|
|
<td>HmacSHA1</td>
|
|
<td>23+</td>
|
|
<td>Supported key specs: {@link android.security.keystore.KeyInfo}</td>
|
|
</tr>
|
|
<tr>
|
|
<td>HmacSHA224</td>
|
|
<td>23+</td>
|
|
<td>Supported key specs: {@link android.security.keystore.KeyInfo}</td>
|
|
</tr>
|
|
<tr>
|
|
<td>HmacSHA256</td>
|
|
<td>23+</td>
|
|
<td>Supported key specs: {@link android.security.keystore.KeyInfo}</td>
|
|
</tr>
|
|
<tr>
|
|
<td>HmacSHA384</td>
|
|
<td>23+</td>
|
|
<td>Supported key specs: {@link android.security.keystore.KeyInfo}</td>
|
|
</tr>
|
|
<tr>
|
|
<td>HmacSHA512</td>
|
|
<td>23+</td>
|
|
<td>Supported key specs: {@link android.security.keystore.KeyInfo}</td>
|
|
</tr>
|
|
</tbody>
|
|
</table> |