KeyProtection Clase
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
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
- 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 |
Handle |
Identificador de la instancia de Android subyacente. (Heredado de Object) |
IsDigestsSpecified |
Devuelve |
IsInvalidatedByBiometricEnrollment |
Devuelve |
IsRandomizedEncryptionRequired |
Devuelve |
IsUnlockedDeviceRequired |
Devuelve |
IsUserAuthenticationRequired |
Devuelve |
IsUserAuthenticationValidWhileOnBody |
Devuelve |
IsUserConfirmationRequired |
Devuelve |
IsUserPresenceRequired |
Devuelve |
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 |
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. |