Contraseña de devolución de llamada para la lectura de clave pública con OpenSSL API

votos
2

Cuando se utiliza la criptografía de clave pública, a menudo es habitual para almacenar las claves privadas en un formato codificado, ya que se supone por supuesto que es un secreto. Esto se refleja en la API OpenSSL C, que proporciona funciones como PEM_write_PrivateKey, que toma como argumentos de la función de un sistema de cifrado opcional para utilizar para cifrar la clave (como AES). Entonces, al leer la clave de cifrado de vuelta desde el disco, la API de OpenSSL proporciona funciones como PEM_read_PrivateKey, que permite al usuario proporcionar un puntero de función utilizado como una devolución de llamada por lo que la aplicación puede proporcionar OpenSSL con la contraseña de la clave de cifrado.

Pero lo que me confunde es que la API OpenSSL también parece permitir que el usuario proporcione una devolución de llamada contraseña cuando se lee en un público clave. Por ejemplo, una firma de función API para la lectura en una clave pública es:

 EVP_PKEY *PEM_read_PUBKEY(FILE *fp, EVP_PKEY **x,
                                        pem_password_cb *cb, void *u);

Entonces, ¿cuál es el propósito de proporcionar una devolución de llamada contraseña cuando se lee en un público clave? Que yo sepa, no tiene sentido para cifrar una clave pública, ya que una clave pública es, por definición, se supone que estará disponible para el público en general. Entonces, ¿por qué la API de OpenSSL tiene un parámetro de función aquí que toma una devolución de llamada contraseña?

Publicado el 19/09/2018 a las 17:06
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
1

Como se menciona en este comentario , cualquier dato PEM-codificada pueden ser encriptados. El cifrado de mensajes de correo de privacidad mejorada (PEM) se define en el RFC 1421 y en el contexto de su pregunta, es interesante mirar el ejemplo de mensaje en la sección 4.6 Resumen de encapsulado Campos de cabecera

-----BEGIN PRIVACY-ENHANCED MESSAGE-----
Proc-Type: 4,ENCRYPTED
Content-Domain: RFC822
DEK-Info: DES-CBC,F8143EDE5960C597
Originator-ID-Symmetric: linn@zendia.enet.dec.com,,
Recipient-ID-Symmetric: linn@zendia.enet.dec.com,ptf-kmc,3
Key-Info: DES-ECB,RSA-MD2,9FD3AAD2F2691B9A,
          B70665BB9BF7CBCDA60195DB94F727D3
Recipient-ID-Symmetric: pem-dev@tis.com,ptf-kmc,4
Key-Info: DES-ECB,RSA-MD2,161A3F75DC82EF26,
          E2EF532C65CBCFF79F83A2658132DB47

LLrHB0eJzyhP+/fSStdW8okeEnv47jxe7SJ/iN72ohNcUk2jHEUSoH1nvNSIWL9M
8tEjmF/zxB+bATMtPjCUWbz8Lr9wloXIkjHUlBLpvXR0UrUzYbkNpk0agV2IzUpk
J6UiRRGcDSvzrsoK+oNvqu6z7Xs5Xfz5rDqUcMlK1Z6720dcBWGGsDLpTpSCnpot
dXd/H5LMDWnonNvPCwQUHt==
-----END PRIVACY-ENHANCED MESSAGE-----

En cuanto a la rama 1.1 de OpenSSL tiene una función PEM_read_bio()que soporta la lectura de un mensaje tal y dividiéndolo en su nombre (como se da en la línea superior), la cabecera (los pares de nombre-valor por debajo de esa) y los datos (el material codificado en base 64 ):

 int PEM_read_bio(BIO *in, char **name, char **header,
                  unsigned char **data, long *len);

Todos OpenSSL PEM_read_XYZ()funciones en algún momento lo invocan, de PEM_bytes_read_bio(), porque todos ellos se implementan de la misma manera por medio de expansiones de macro. Esa función contiene las siguientes llamadas:

PEM_read_bio(bp, &nm, &header, &data, &len)

para dividir el mensaje, a continuación,

PEM_get_EVP_CIPHER_INFO(header, &cipher);

para averiguar qué tipo de información de cifrado se encuentra en la cabecera del mensaje y rellenar un EVP_CIPHER_INFOobjeto con ella, y luego

PEM_do_header(&cipher, data, &len, cb, u);

para hacer el descifrado de los datos en base a la información de cifrado encontrado - de nuevo si es necesario. Tenga en cuenta el cbparámetro que representa la devolución de llamada, un mecanismo para conseguir la entrada para cualquier frase de contraseña si es necesario.

Ahora lo que podría ser confuso, es que ciertos formatos de clave privada, como por ejemplo PKCS # 8, también tienen su propio mecanismo de almacenamiento de información de cifrado independiente de la codificación PEM. Técnicamente hablando, debería ser posible aplicar el cifrado a dichas claves dos veces: una vez en el nivel de PEM y una vez en el nivel PKCS # 8. No parece que estas herramientas de OpenSSL para generar o convertir a PKCS # 8 teclas con formato para ofrecer esa opción sin embargo. Además, ninguna de las herramientas parecen exponer la opción de cifrar los archivos PEM clave pública generada, a menos que una clave privada se incluye también.

Puede comprobar algunas de las salidas para ver si coinciden con mi historia. En primer lugar, generar un par de claves RSA para un formato PKCS # 1, nada cifrada:

$ openssl genrsa
Generating RSA private key, 2048 bit long modulus (2 primes)
.................+++++
............+++++
e is 65537 (0x010001)
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAlcnR/w7zPoLrhuqFvcfz5fn8DFb0fEcCKOKSj+x+JJxGth9P
rJbxkt4pRXxbMIL0fX59HN5bRvQh2g59l/kfr30kCOnclap9nRrohWyg2i7720Cw
<truncated>

A continuación, el mismo comando, pero el uso de cifrado, que sucede a nivel PEM, como se puede ver en las cabeceras:

$ openssl genrsa -des3
Generating RSA private key, 2048 bit long modulus (2 primes)
.....................+++++
....................+++++
e is 65537 (0x010001)
Enter pass phrase:
Verifying - Enter pass phrase:
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,D90861647707F687

DIupLghCjcvpLenqAAULaJj1EDvUUfc2Xc58YVh7rMTSVgLwZ+9CtnUQJcup4aUQ
a1EdGXTadwBQB2jTtiFJbH67/5D26PHXPnM+YN2rnoReOExVS7hKu3DTq7c4j6a3
<truncated>

Por último la generación de una clave similar, pero ahora a PKCS # 8, que tiene su propio cifrado y por lo tanto no recibe encriptada a nivel PEM. Se puede ver que las cabeceras de PEM no están allí.

$ openssl genpkey -algorithm RSA -des3
.........................................+++++
...........................................................................+++++
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIV0Ih4bsI6egCAggA
MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECNOim8HAN8j5BIIEyEe05hHtc8HL
<truncated>

Si todo mi razonamiento es correcto, entonces el mensaje "Introducir PEM frase de paso" es inexacta ya que este no es un cifrado a nivel de PEM, pero un PKCS # cifrado de 8 niveles.

Respondida el 19/09/2018 a las 23:04
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more