Preguntas sobre las variaciones de las claves RSA

2

He creado una aplicación simple que lee una clave RSA, verifica el encabezado y comienza a identificar las propiedades de la clave RSA para asegurar que sea válida (usando child_process en express para ejecutar

$ openssl rsa -inform PEM -in ~/.ssh/id_rsa -check

Así que luego de una llamada de descanso de mi servidor local, puedo verificar los encabezados, supongo que está codificado en PEM base64, volcar en el terminal, verificar que sea coherente con la estructura correcta de una clave.

Cuando comencé a ver, había muchas formas en que podía ingresar la clave RSA, ya sea PEM, DER, NET, esperaba recibir orientación de algunos expertos sobre cuál es la forma más probable de que haya recibido las claves y formas en que se puede utilizar para verificar su integridad o quizás su estructura.

En última instancia, estaría considerando las claves para las fechas posteriores a 2030 (de modo que si se obtuviera una clave de 2048 bits, puedo sugerir que la clave se convierta en 4096 bits como una alternativa más sólida).

TL; DR: de todos los formularios en los que normalmente se manejan las claves RSA, cuáles son los formatos principales que se utilizan y cuáles son algunos posibles enfoques de validación.

    
pregunta mcnichol 07.12.2015 - 06:29
fuente

2 respuestas

2

Los formularios comunes son PKCS # 12 / PFX (un par de claves cifradas, posiblemente con certificados adicionales) y PEM o DER forme PKCS # 1 como lo usan OpenSSL y OpenSSH (eso es lo que id_rsa será). PEM es una versión base64 del formulario binario DER (ASN.1) con encabezado / pie de página de identificación, no es una forma distinta, excepto que permite el cifrado en la medida en que PKCS # 1 DER no.

Si la clave está cifrada (solo en forma PEM), contendrá líneas de encabezado adicionales para indicar el cifrado y IV, por ejemplo:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,AA171F6005B3DD31
...

PKCS # 1 es solo RSA, PKCS # 8 es un "contenedor" de propósito más general para las claves, también es ASN.1 pero indica explícitamente el tipo de datos dentro, por ejemplo, (ver offset 9, línea 4):

$ openssl pkcs8 -inform PEM -in ~/.ssh/id_rsa -topk8 -nocrypt \
  -outform DER -out id_rsa.p8 
$ dumpasn1 -tilda id_rsa.p8
 0 1213: SEQUENCE {
 4    1: . INTEGER 0
 7   13: . SEQUENCE {
 9    9: . . OBJECT IDENTIFIER rsaEncryption (1 2 840 113549 1 1 1)
       : . . . (PKCS #1)
20    0: . . NULL
       : . . }
22 1191: . OCTET STRING, encapsulates {
26 1187: . . SEQUENCE {
30    1: . . . INTEGER 0
33  257: . . . INTEGER    
       : . . . . 00 B1 1F 09 61 C1 A1 09    ....a...
 ...

(Estoy usando dumpasn1 aquí en lugar de openssl asn1parse , vergonzosamente, este último no puede analizar la salida pkcs8 correctamente).

OpenSSH no admite (AFAIK) PKCS # 8 que no sea para importar / exportar, tienen su formato propio . Ese formato se usa solo para los tipos de clave más nuevos (Ed25519), pero se planea que sea el predeterminado en el futuro.

Hay algunas cosas que puedes verificar útilmente:

  1. identificar la línea de encabezado / pie de página en PEM y la validez de codificación de base64
  2. formato ASN.1 válido (principalmente limitado a las verificaciones de tipo y longitud)
  3. integridad numérica de los parámetros RSA

También puede rumiar en valor del exponente público (demasiado grande puede causar problemas de interoperabilidad, demasiado pequeño está implicado con problemas de seguridad para algunas aplicaciones).

El comando openssl rsa ... -check comprueba 1 (solo PEM) y 2 implícitamente, y 3 explícitamente. Consulte la documentación de la API de OpenSSL RSA_check_key() para obtener detalles de las comprobaciones. Eso debería ser suficiente para la mayoría, creo.

Un archivo de clave privada RSA (casi siempre) contiene más que solo el exponente de clave privada, también contiene los parámetros de clave pública y algunos valores intermedios para la optimización (a través de CRT ), estos valores pueden verificarse para determinar su consistencia o primacía. El "tamaño de la clave" es la longitud del '' módulo '', con la advertencia de que (normalmente) habrá un 00 bytes iniciales para garantizar que se interpreta como un entero positivo (problema con la firma del ASN.1).

Para una vista diferente, también puedes hacer:

openssl asn1parse -inform PEM -in ~/.ssh/id_rsa

(pero eso no comprueba los parámetros RSA)

    
respondido por el mr.spuratic 02.12.2016 - 18:34
fuente
0

Hay algunos estándares que tratan este tema:

  • PKCS # 8 trata sobre el almacenamiento de claves privadas.
  • PKCS # 11 trata sobre las API que utiliza el software criptográfico.
  • PKCS # 12 trata sobre un formato de archivo para muchos objetos de criptografía en un solo archivo.
  • PKCS # 7 el RFC2315 también es una buena fuente de información. Se trata de cómo funcionan las PKI con la firma / encriptación.
  • PKCS Wikipedia tiene una buena visión general del tema.

En resumen, el panorama de claves y certificados es demasiado amplio para darle una respuesta específica. Todo lo que puedo hacer es darte esta lista de temas de estudio adicionales para que puedas seguir tu camino.

    
respondido por el LvB 07.12.2015 - 11:28
fuente

Lea otras preguntas en las etiquetas