Atributos de clave de Java compatibles con SDK 3 de cliente - AWS CloudHSM

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Atributos de clave de Java compatibles con SDK 3 de cliente

En este tema, se describe cómo puede utilizar una extensión propia con la versión 3.1 de la biblioteca de Java para establecer atributos de clave. Utilice esta extensión para establecer los atributos de clave admitidos y sus valores durante estas operaciones:

  • Generación de claves

  • Importación de claves

  • Desencapsulamiento de claves

nota

La extensión para establecer atributos de clave personalizados es una característica opcional. Si ya tiene un código que funciona en la versión 3.0 de la biblioteca de Java , no es necesario que lo modifique. Las claves que cree seguirán teniendo los mismos atributos que antes.

Descripción de los atributos

Los atributos de clave se utilizan para especificar qué acciones se permiten en objetos relacionados con las claves, como claves públicas, privadas o secretas. Los atributos y valores de clave se definen durante las operaciones de creación de objetos de clave.

Sin embargo, Java Cryptography Extension (JCE) no especifica cómo deben establecerse los valores de los atributos de clave, por lo que, de forma predeterminada, se permiten la mayoría de las acciones. Por el contrario, el estándar PKCS #11 define un completo conjunto de atributos con valores predeterminados más restrictivos. A partir de la versión 3.1 de la biblioteca de Java, CloudHSM cuenta con una extensión propia que permite establecer valores más restrictivos para los atributos que se usan habitualmente.

Atributos admitidos

Puede establecer valores para los atributos que aparecen en la tabla siguiente. Es recomendable que solamente establezca valores para los atributos que desee hacer más restrictivos. Si no se especifica ningún valor, CloudHSM utilizará el valor predeterminado que se indica en la tabla siguiente. Las celdas vacías de la columna «Valor predeterminado» indican que no hay ningún valor predeterminado específico asignado al atributo.

Atributo Valor predeterminado Notas
Clave simétrica Clave pública del par de claves Clave privada del par de claves
CKA_TOKEN FALSE FALSE FALSE

Clave permanente que se replica en todos los HSM del clúster y se incluye en las copias de seguridad. CKA_TOKEN = FALSE implica el uso de una clave de sesión, que se carga en un único HSM y se borra automáticamente cuando se interrumpe la conexión con ese HSM.

CKA_LABEL Cadena definida por el usuario. Permite identificar fácilmente las claves en el HSM.
CKA_EXTRACTABLE TRUE TRUE True indica que esta clave se puede exportar fuera del HSM.
CKA_ENCRYPT TRUE TRUE True indica que la clave se puede utilizar para cifrar cualquier búfer.
CKA_DECRYPT TRUE TRUE True indica que la clave se puede utilizar para descifrar cualquier búfer. Por lo general, cuando una clave tiene el valor True en CKA_WRAP, se utiliza el valor FALSE.
CKA_WRAP TRUE TRUE True indica que la clave se puede utilizar para encapsular otra clave. Por lo general, se utilizará el valor FALSE con las claves privadas.
CKA_UNWRAP TRUE TRUE True indica que la clave se puede utilizar para desencapsular (importar) otra clave.
CKA_SIGN TRUE TRUE True indica que la clave se puede utilizar para firmar un resumen del mensaje. Normalmente, se utiliza el valor FALSE con las claves públicas y privadas que se han archivado.
CKA_VERIFY TRUE TRUE True indica que la clave se puede utilizar para verificar una firma. Normalmente, se utiliza el valor FALSE con las claves privadas.
CKA_PRIVATE TRUE TRUE TRUE True indica que es posible que los usuarios no tengan acceso a la clave hasta que se autentiquen. Es decir, los usuarios no pueden acceder a ninguna clave de CloudHSM hasta que se autentican, incluso aunque este atributo esté establecido en FALSE.
nota

La compatibilidad con los atributos de la biblioteca PKCS #11 es más amplia. Para obtener más información, consulte Atributos de PKCS #11 admitidos.

Configuración de atributos para claves

CloudHsmKeyAttributesMap es un objeto similar a Java Map, que puede usar para establecer valores de atributo en los objetos de clave. Los métodos de la función CloudHsmKeyAttributesMap son iguales que los métodos que se utilizan para manipular mapas de Java.

Si desea establecer valores personalizados en los atributos, tiene dos opciones:

  • Utilizar los métodos que se indican en la tabla siguiente

  • Utilizar los modelos de Builder que se ilustran más adelante en este documento

Los objetos de mapa de atributos admiten los siguientes métodos para establecer atributos:

Operación Valor de retorno Método de CloudHSMKeyAttributesMap
Obtener el valor de un atributo de clave para una clave existente Objeto (que contiene el valor) o null

get(keyAttribute)

Rellenar el valor de un atributo de clave Valor anterior asociado con el atributo de clave o null si no había ninguna asignación de un atributo de clave

put(keyAttribute, valor)

Rellenar valores en varios atributos de clave N/A

PuTall () keyAttributesMap

Eliminar un par clave-valor del mapa de atributos

Valor anterior asociado con el atributo de clave o null si no había ninguna asignación de un atributo de clave

remove(keyAttribute)

nota

Los atributos que no se especifican explícitamente se establecen en los valores predeterminados que se indican en la tabla anterior de Atributos admitidos.

Ejemplo de modelo de Builder

Por lo general, a los desarrolladores les resultará más cómodo utilizar las clases a través del modelo Builder. Por ejemplo:

import com.amazonaws.cloudhsm.CloudHsmKeyAttributes; import com.amazonaws.cloudhsm.CloudHsmKeyAttributesMap; import com.amazonaws.cloudhsm.CloudHsmKeyPairAttributesMap; CloudHsmKeyAttributesMap keyAttributesSessionDecryptionKey = new CloudHsmKeyAttributesMap.Builder() .put(CloudHsmKeyAttributes.CKA_LABEL, "ExtractableSessionKeyEncryptDecrypt") .put(CloudHsmKeyAttributes.CKA_WRAP, false) .put(CloudHsmKeyAttributes.CKA_UNWRAP, false) .put(CloudHsmKeyAttributes.CKA_SIGN, false) .put(CloudHsmKeyAttributes.CKA_VERIFY, false) .build(); CloudHsmKeyAttributesMap keyAttributesTokenWrappingKey = new CloudHsmKeyAttributesMap.Builder() .put(CloudHsmKeyAttributes.CKA_LABEL, "TokenWrappingKey") .put(CloudHsmKeyAttributes.CKA_TOKEN, true) .put(CloudHsmKeyAttributes.CKA_ENCRYPT, false) .put(CloudHsmKeyAttributes.CKA_DECRYPT, false) .put(CloudHsmKeyAttributes.CKA_SIGN, false) .put(CloudHsmKeyAttributes.CKA_VERIFY, false) .build();

Es posible que los desarrolladores utilicen también conjunto de atributos para aplicar con mayor comodidad las prácticas recomendadas para las plantillas de claves. Por ejemplo:

//best practice template for wrapping keys CloudHsmKeyAttributesMap commonKeyAttrs = new CloudHsmKeyAttributesMap.Builder() .put(CloudHsmKeyAttributes.CKA_EXTRACTABLE, false) .put(CloudHsmKeyAttributes.CKA_DECRYPT, false) .build(); // initialize a new instance of CloudHsmKeyAttributesMap by copying commonKeyAttrs // but with an appropriate label CloudHsmKeyAttributesMap firstKeyAttrs = new CloudHsmKeyAttributesMap(commonKeyAttrs); firstKeyAttrs.put(CloudHsmKeyAttributes.CKA_LABEL, "key label"); // alternatively, putAll() will overwrite existing values to enforce conformance CloudHsmKeyAttributesMap secondKeyAttrs = new CloudHsmKeyAttributesMap(); secondKeyAttrs.put(CloudHsmKeyAttributes.CKA_DECRYPT, true); secondKeyAttrs.put(CloudHsmKeyAttributes.CKA_ENCRYPT, true); secondKeyAttrs.put(CloudHsmKeyAttributes.CKA_LABEL, “safe wrapping key”); secondKeyAttrs.putAll(commonKeyAttrs); // will overwrite CKA_DECRYPT to be FALSE

Configuración de atributos para un par de claves

Utilice la clase CloudHsmKeyPairAttributesMap de Java para administrar los atributos de clave de un par de claves. CloudHsmKeyPairAttributesMap encapsula dos objetos CloudHsmKeyAttributesMap: uno para una clave pública y otro para una clave privada.

Para establecer por separado atributos específicos en la clave pública y en la clave privada, puede utilizar el método put() en el objeto de mapa CloudHsmKeyAttributes que corresponda a esa clave. Utilice el método getPublic() para recuperar el mapa de atributos de la clave pública y utilice getPrivate() para recuperar el mapa de atributos de la clave privada. Puede rellenar el valor de varios atributos de clave a la vez tanto de pares de claves públicas como de pares de claves privadas utilizando putAll() con un mapa de atributos de pares de claves como argumento.

Ejemplo de modelo de Builder

Por lo general, a los desarrolladores les resultará más cómodo establecer los atributos de clave a través del modelo Builder. Por ejemplo:

import com.amazonaws.cloudhsm.CloudHsmKeyAttributes; import com.amazonaws.cloudhsm.CloudHsmKeyAttributesMap; import com.amazonaws.cloudhsm.CloudHsmKeyPairAttributesMap; //specify attributes up-front CloudHsmKeyAttributesMap keyAttributes = new CloudHsmKeyAttributesMap.Builder() .put(CloudHsmKeyAttributes.CKA_SIGN, false) .put(CloudHsmKeyAttributes.CKA_LABEL, "PublicCertSerial12345") .build(); CloudHsmKeyPairAttributesMap keyPairAttributes = new CloudHsmKeyPairAttributesMap.Builder() .withPublic(keyAttributes) .withPrivate( new CloudHsmKeyAttributesMap.Builder() //or specify them inline .put(CloudHsmKeyAttributes.CKA_LABEL, "PrivateCertSerial12345") .put (CloudHSMKeyAttributes.CKA_WRAP, FALSE) .build() ) .build();
nota

Para obtener más información acerca de esta extensión propietaria, consulte el archivo Javadoc y el ejemplo en. GitHub Para ver el Javadoc, descargue y abra el archivo.

Resumen global

Para especificar atributos de clave con operaciones de claves, siga estos pasos:

  1. Crear una instancia de CloudHsmKeyAttributesMap para las claves simétricas o de CloudHsmKeyPairAttributesMap para los pares de claves.

  2. Defina el objeto attributes en el paso 1 con los atributos de clave y los valores que corresponda.

  3. Cree una instancia de la clase Cavium*ParameterSpec que corresponda al tipo de clave específico y pase este objeto de atributos configurado a su constructor.

  4. Pase este objeto Cavium*ParameterSpec a la clase o el método criptográfico que corresponda.

Si necesita más información, la tabla siguiente contiene las clases y métodos de Cavium*ParameterSpec que admiten atributos de clave personalizados.

Tipo de clave Clase de especificación de parámetros Constructores de ejemplo
Clase base CaviumKeyGenAlgorithmParameterSpec CaviumKeyGenAlgorithmParameterSpec(CloudHsmKeyAttributesMap keyAttributesMap)
DES CaviumDESKeyGenParameterSpec CaviumDESKeyGenParameterSpec(int keySize, byte[] iv, CloudHsmKeyAttributesMap keyAttributesMap)
RSA CaviumRSAKeyGenParameterSpec CaviumRSAKeyGenParameterSpec(int keysize, BigInteger publicExponent, CloudHsmKeyPairAttributesMap keyPairAttributesMap)
secreta CaviumGenericSecretKeyGenParameterSpec CaviumGenericSecretKeyGenParameterSpec(int size, CloudHsmKeyAttributesMap keyAttributesMap)
AES CaviumAESKeyGenParameterSpec CaviumAESKeyGenParameterSpec(int keySize, byte[] iv, CloudHsmKeyAttributesMap keyAttributesMap)
EC CaviumECGenParameterSpec CaviumECGenParameterSpec(String stdName, CloudHsmKeyPairAttributesMap keyPairAttributesMap)

Código de muestra: generar y encapsular una clave

En estos breves ejemplos de código, se muestran los pasos de dos operaciones diferentes: generación de claves y encapsulamiento de claves:

// Set up the desired key attributes KeyGenerator keyGen = KeyGenerator.getInstance("AES", "Cavium"); CaviumAESKeyGenParameterSpec keyAttributes = new CaviumAESKeyGenParameterSpec( 256, new CloudHsmKeyAttributesMap.Builder() .put(CloudHsmKeyAttributes.CKA_LABEL, "MyPersistentAESKey") .put(CloudHsmKeyAttributes.CKA_EXTRACTABLE, true) .put(CloudHsmKeyAttributes.CKA_TOKEN, true) .build() ); // Assume we already have a handle to the myWrappingKey // Assume we already have the wrappedBytes to unwrap // Unwrap a key using Custom Key Attributes CaviumUnwrapParameterSpec unwrapSpec = new CaviumUnwrapParameterSpec(myInitializationVector, keyAttributes); Cipher unwrapCipher = Cipher.getInstance("AESWrap", "Cavium"); unwrapCipher.init(Cipher.UNWRAP_MODE, myWrappingKey, unwrapSpec); Key unwrappedKey = unwrapCipher.unwrap(wrappedBytes, "AES", Cipher.SECRET_KEY);