Compartir a través de


KeyProtection Clase

Definición

Especificación de cómo se protege una clave o un par de claves cuando se importa en el sistema android Keystore.

[Android.Runtime.Register("android/security/keystore/KeyProtection", ApiSince=23, DoNotGenerateAcw=true)]
public sealed class KeyProtection : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, Java.Security.KeyStore.IProtectionParameter
[<Android.Runtime.Register("android/security/keystore/KeyProtection", ApiSince=23, DoNotGenerateAcw=true)>]
type KeyProtection = class
    inherit Object
    interface KeyStore.IProtectionParameter
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
Herencia
KeyProtection
Atributos
Implementaciones

Comentarios

Especificación de cómo se protege una clave o un par de claves cuando se importa en el sistema android Keystore. Esta clase especifica los usos autorizados de la clave importada, como si se requiere autenticación de usuario para usar la clave, para qué operaciones está autorizada la clave (por ejemplo, descifrado, pero no firma) con qué parámetros (por ejemplo, solo con un esquema de relleno o resumen concretos) y las fechas de inicio y finalización de la clave. Las autorizaciones de uso de claves expresadas en esta clase solo se aplican a claves secretas y claves privadas: las claves públicas se pueden usar para las operaciones admitidas.

Para importar una clave o un par de claves en el almacén de claves de Android, cree una instancia de esta clase mediante Builder y pase la instancia a java.security.KeyStore#setEntry(String, java.security.KeyStore.Entry, ProtectionParameter) KeyStore.setEntry con la clave o el par de claves que se va a importar.

Para obtener la clave secreta, simétrica o privada del almacén de claves de Android, use java.security.KeyStore#getKey(String, char[]) KeyStore.getKey(String, null) o java.security.KeyStore#getEntry(String, java.security.KeyStore.ProtectionParameter) KeyStore.getEntry(String, null). Para obtener la clave pública del almacén de claves de Android, use java.security.KeyStore#getCertificate(String) y, a continuación, Certificate#getPublicKey().

Para ayudar a obtener parámetros públicos específicos del algoritmo de pares de claves almacenados en el almacén de claves de Android, sus claves privadas implementan java.security.interfaces.ECKey o java.security.interfaces.RSAKey interfaces, mientras que sus claves públicas implementan java.security.interfaces.ECPublicKey o java.security.interfaces.RSAPublicKey interfaces.

NOTA: No se puede acceder al material clave de las claves almacenadas en el almacén de claves de Android.

Las instancias de esta clase son inmutables.

<h3>Problemas conocidos</h3> Un error conocido en Android 6.0 (nivel de API 23) hace que se apliquen autorizaciones relacionadas con la autenticación de usuarios incluso para las claves públicas. Para solucionar este problema, extraiga el material de clave pública que se va a usar fuera del almacén de claves de Android. Por ejemplo:

{@code
            PublicKey unrestrictedPublicKey =
                    KeyFactory.getInstance(publicKey.getAlgorithm()).generatePublic(
                            new X509EncodedKeySpec(publicKey.getEncoded()));
            }

<h3>Ejemplo: clave AES para cifrado y descifrado en modo< GCM/h3> En este ejemplo se muestra cómo importar una clave AES en android KeyStore bajo alias key1 autorizado para usarse solo para el cifrado o descifrado en modo GCM sin relleno. La clave debe exportar su material clave a través de Key#getEncoded() en RAW formato .

{@code
            SecretKey key = ...; // AES key

            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
            keyStore.load(null);
            keyStore.setEntry(
                    "key1",
                    new KeyStore.SecretKeyEntry(key),
                    new KeyProtection.Builder(KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
                            .setBlockMode(KeyProperties.BLOCK_MODE_GCM)
                            .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
                            .build());
            // Key imported, obtain a reference to it.
            SecretKey keyStoreKey = (SecretKey) keyStore.getKey("key1", null);
            // The original key can now be discarded.

            Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
            cipher.init(Cipher.ENCRYPT_MODE, keyStoreKey);
            ...
            }

<h3>Ejemplo: clave HMAC para generar MACs mediante SHA-512</h3> Este ejemplo muestra cómo importar una clave HMAC en Android KeyStore en el alias key1 autorizado para usarse solo para generar MAC mediante resumen SHA-512. La clave debe exportar su material clave a través de Key#getEncoded() en RAW formato .

{@code
            SecretKey key = ...; // HMAC key of algorithm "HmacSHA512".

            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
            keyStore.load(null);
            keyStore.setEntry(
                    "key1",
                    new KeyStore.SecretKeyEntry(key),
                    new KeyProtection.Builder(KeyProperties.PURPOSE_SIGN).build());
            // Key imported, obtain a reference to it.
            SecretKey keyStoreKey = (SecretKey) keyStore.getKey("key1", null);
            // The original key can now be discarded.

            Mac mac = Mac.getInstance("HmacSHA512");
            mac.init(keyStoreKey);
            ...
            }

<Ejemplo h3>: par de claves EC para firma/comprobación mediante ECDSA</h3> En este ejemplo se muestra cómo importar un par de claves EC en android KeyStore en alias key2 con la clave privada autorizada para usarse solo para firmar con resúmenes SHA-256 o SHA-512. El uso de la clave pública no está restringido. Tanto la clave privada como la clave pública deben exportar su material de clave a través Key#getEncoded() de en formato y X.509 , PKCS#8 respectivamente.

{@code
            PrivateKey privateKey = ...;   // EC private key
            Certificate[] certChain = ...; // Certificate chain with the first certificate
                                           // containing the corresponding EC public key.

            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
            keyStore.load(null);
            keyStore.setEntry(
                    "key2",
                    new KeyStore.PrivateKeyEntry(privateKey, certChain),
                    new KeyProtection.Builder(KeyProperties.PURPOSE_SIGN)
                            .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
                            .build());
            // Key pair imported, obtain a reference to it.
            PrivateKey keyStorePrivateKey = (PrivateKey) keyStore.getKey("key2", null);
            PublicKey publicKey = keyStore.getCertificate("key2").getPublicKey();
            // The original private key can now be discarded.

            Signature signature = Signature.getInstance("SHA256withECDSA");
            signature.initSign(keyStorePrivateKey);
            ...
            }

<h3>Ejemplo: par de claves RSA para la firma o comprobación mediante el relleno PKCS#1</h3> Este ejemplo muestra cómo importar un par de claves RSA en android KeyStore en alias key2 con la clave privada autorizada para usar solo para firmar con el esquema de relleno de firmas PKCS#1 con resumen SHA-256 y solo si el usuario se ha autenticado en los últimos diez minutos. El uso de la clave pública no está restringido (consulte Problemas conocidos). Tanto la clave privada como la clave pública deben exportar su material de clave a través Key#getEncoded() de en formato y X.509 , PKCS#8 respectivamente.

{@code
            PrivateKey privateKey = ...;   // RSA private key
            Certificate[] certChain = ...; // Certificate chain with the first certificate
                                           // containing the corresponding RSA public key.

            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
            keyStore.load(null);
            keyStore.setEntry(
                    "key2",
                    new KeyStore.PrivateKeyEntry(privateKey, certChain),
                    new KeyProtection.Builder(KeyProperties.PURPOSE_SIGN)
                            .setDigests(KeyProperties.DIGEST_SHA256)
                            .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
                            // Only permit this key to be used if the user
                            // authenticated within the last ten minutes.
                            .setUserAuthenticationRequired(true)
                            .setUserAuthenticationValidityDurationSeconds(10 * 60)
                            .build());
            // Key pair imported, obtain a reference to it.
            PrivateKey keyStorePrivateKey = (PrivateKey) keyStore.getKey("key2", null);
            PublicKey publicKey = keyStore.getCertificate("key2").getPublicKey();
            // The original private key can now be discarded.

            Signature signature = Signature.getInstance("SHA256withRSA");
            signature.initSign(keyStorePrivateKey);
            ...
            }

<Ejemplo de h3>: par de claves RSA para cifrado y descifrado mediante el relleno PKCS#1</h3> En este ejemplo se muestra cómo importar un par de claves RSA en android KeyStore en alias key2 con la clave privada autorizada para usarse solo para el descifrado mediante el esquema de relleno de cifrado PKCS#1. El uso de la clave pública no está restringido, lo que permite el cifrado mediante cualquier esquema de relleno y resúmenes. Tanto la clave privada como la clave pública deben exportar su material de clave a través Key#getEncoded() de en formato y X.509 , PKCS#8 respectivamente.

{@code
            PrivateKey privateKey = ...;   // RSA private key
            Certificate[] certChain = ...; // Certificate chain with the first certificate
                                           // containing the corresponding RSA public key.

            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
            keyStore.load(null);
            keyStore.setEntry(
                    "key2",
                    new KeyStore.PrivateKeyEntry(privateKey, certChain),
                    new KeyProtection.Builder(KeyProperties.PURPOSE_DECRYPT)
                            .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
                            .build());
            // Key pair imported, obtain a reference to it.
            PrivateKey keyStorePrivateKey = (PrivateKey) keyStore.getKey("key2", null);
            PublicKey publicKey = keyStore.getCertificate("key2").getPublicKey();
            // The original private key can now be discarded.

            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            cipher.init(Cipher.DECRYPT_MODE, keyStorePrivateKey);
            ...
            }

Documentación de Java para android.security.keystore.KeyProtection.

Las partes de esta página son modificaciones basadas en el trabajo creado y compartido por el proyecto de código abierto de Android y se usan según los términos descritos en la licencia de atribución de Creative Commons 2.5.

Propiedades

Class

Devuelve la clase en tiempo de ejecución de este Objectobjeto .

(Heredado de Object)
Handle

Identificador de la instancia de Android subyacente.

(Heredado de Object)
IsDigestsSpecified

Devuelve true si se ha especificado el conjunto de algoritmos de resumen con los que se puede usar la clave.

IsInvalidatedByBiometricEnrollment

Devuelve true si la clave se invalida irreversiblemente cuando se inscribe una nueva biometría o se quitan todas las biométricas inscritas.

IsRandomizedEncryptionRequired

Devuelve true si el cifrado que usa esta clave debe ser lo suficientemente aleatorio para generar diferentes texto cifrados para el mismo texto sin formato cada vez.

IsUnlockedDeviceRequired

Devuelve true si la pantalla debe desbloquearse para que esta clave se use para el descifrado o la firma.

IsUserAuthenticationRequired

Devuelve true si la clave está autorizada para usarse solo si el usuario se ha autenticado.

IsUserAuthenticationValidWhileOnBody

Devuelve true si la clave se desconecta cuando el dispositivo se quita del cuerpo del usuario.

IsUserConfirmationRequired

Devuelve true si la clave está autorizada para usarse solo para los mensajes confirmados por el usuario.

IsUserPresenceRequired

Devuelve true si la clave está autorizada para usarse solo si se ha realizado una prueba de presencia del usuario entre las Signature.initSign() llamadas y Signature.sign() .

JniIdentityHashCode

Especificación de cómo se protege una clave o un par de claves cuando se importa en el sistema android Keystore.

(Heredado de Object)
JniPeerMembers

Especificación de cómo se protege una clave o un par de claves cuando se importa en el sistema android Keystore.

KeyValidityForConsumptionEnd

Obtiene el instante de tiempo después del cual la clave no es válida durante mucho tiempo para el descifrado y la comprobación.

KeyValidityForOriginationEnd

Obtiene el instante de tiempo después del cual la clave no es válida durante mucho tiempo para el cifrado y la firma.

KeyValidityStart

Obtiene el instante de tiempo antes del cual la clave aún no es válida.

MaxUsageCount

Devuelve el número máximo de veces que se permite usar la clave de uso limitada o KeyProperties#UNRESTRICTED_USAGE_COUNT si no hay ninguna restricción en el número de veces que se puede usar la clave.

PeerReference

Especificación de cómo se protege una clave o un par de claves cuando se importa en el sistema android Keystore.

(Heredado de Object)
Purposes

Obtiene el conjunto de propósitos (e.

ThresholdClass

Esta API admite la infraestructura mono para Android y no está pensada para usarse directamente desde el código.

(Heredado de Object)
ThresholdType

Esta API admite la infraestructura mono para Android y no está pensada para usarse directamente desde el código.

(Heredado de Object)
UserAuthenticationType

Especificación de cómo se protege una clave o un par de claves cuando se importa en el sistema android Keystore.

UserAuthenticationValidityDurationSeconds

Obtiene la duración del tiempo (segundos) para el que esta clave está autorizada para usarse después de que el usuario se autentique correctamente.

Métodos

Clone()

Crea y devuelve una copia de este objeto.

(Heredado de Object)
Dispose()

Especificación de cómo se protege una clave o un par de claves cuando se importa en el sistema android Keystore.

(Heredado de Object)
Dispose(Boolean)

Especificación de cómo se protege una clave o un par de claves cuando se importa en el sistema android Keystore.

(Heredado de Object)
Equals(Object)

Indica si algún otro objeto es "igual a" este.

(Heredado de Object)
GetBlockModes()

Obtiene el conjunto de modos de bloqueo (e.

GetDigests()

Obtiene el conjunto de algoritmos de resumen (e.

GetEncryptionPaddings()

Obtiene el conjunto de esquemas de relleno (e.

GetHashCode()

Devuelve un valor de código hash del objeto.

(Heredado de Object)
GetSignaturePaddings()

Obtiene el conjunto de esquemas de relleno (e.

JavaFinalize()

Lo llama el recolector de elementos no utilizados en un objeto cuando la recolección de elementos no utilizados determina que no hay más referencias al objeto .

(Heredado de Object)
Notify()

Activa un único subproceso que está esperando en el monitor de este objeto.

(Heredado de Object)
NotifyAll()

Activa todos los subprocesos que están esperando en el monitor de este objeto.

(Heredado de Object)
SetHandle(IntPtr, JniHandleOwnership)

Establece la propiedad Handle.

(Heredado de Object)
ToArray<T>()

Especificación de cómo se protege una clave o un par de claves cuando se importa en el sistema android Keystore.

(Heredado de Object)
ToString()

Devuelve una representación de cadena del objeto.

(Heredado de Object)
UnregisterFromRuntime()

Especificación de cómo se protege una clave o un par de claves cuando se importa en el sistema android Keystore.

(Heredado de Object)
Wait()

Hace que el subproceso actual espere hasta que se despierta, normalmente por ser em notificado/em> o <em>interrumpido</em>.<><

(Heredado de Object)
Wait(Int64, Int32)

Hace que el subproceso actual espere hasta que se despierte, normalmente por ser <em>notificado</em> o <em>interrumpido</em>, o hasta que haya transcurrido una cierta cantidad de tiempo real.

(Heredado de Object)
Wait(Int64)

Hace que el subproceso actual espere hasta que se despierte, normalmente por ser <em>notificado</em> o <em>interrumpido</em>, o hasta que haya transcurrido una cierta cantidad de tiempo real.

(Heredado de Object)

Implementaciones de interfaz explícitas

IJavaPeerable.Disposed()

Especificación de cómo se protege una clave o un par de claves cuando se importa en el sistema android Keystore.

(Heredado de Object)
IJavaPeerable.DisposeUnlessReferenced()

Especificación de cómo se protege una clave o un par de claves cuando se importa en el sistema android Keystore.

(Heredado de Object)
IJavaPeerable.Finalized()

Especificación de cómo se protege una clave o un par de claves cuando se importa en el sistema android Keystore.

(Heredado de Object)
IJavaPeerable.JniManagedPeerState

Especificación de cómo se protege una clave o un par de claves cuando se importa en el sistema android Keystore.

(Heredado de Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

Especificación de cómo se protege una clave o un par de claves cuando se importa en el sistema android Keystore.

(Heredado de Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

Especificación de cómo se protege una clave o un par de claves cuando se importa en el sistema android Keystore.

(Heredado de Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

Especificación de cómo se protege una clave o un par de claves cuando se importa en el sistema android Keystore.

(Heredado de Object)

Métodos de extensión

JavaCast<TResult>(IJavaObject)

Realiza una conversión de tipos comprobados en tiempo de ejecución de Android.

JavaCast<TResult>(IJavaObject)

Especificación de cómo se protege una clave o un par de claves cuando se importa en el sistema android Keystore.

GetJniTypeName(IJavaPeerable)

Especificación de cómo se protege una clave o un par de claves cuando se importa en el sistema android Keystore.

Se aplica a