He visto identificaciones de clave usadas en varios lugares y me gustaría usarlas en mi programa, pero no he podido encontrar una descripción de ellas. ¿Cómo se generan?¿Qué es una "identificación de clave" de RSA?
Respuesta
En diferentes formatos (certificados PGP, SSH, X.509) la identificación de la clave tiene un significado diferente. Ni SSH ni X.509 tienen un concepto "dedicado" de identificación de clave, pero algunas personas usan este término (incluido su software); en este caso, generalmente es un hash de la clave pública o del certificado en su totalidad.
Actualización: los comentarios me recordaron que las extensiones de "identificador de clave" existen en certifiactes X.509, ya veces se las denomina identificadores de clave. Sin embargo, esto no es común, generalmente el hash (también llamado a veces la huella dactilar) se denomina ID de clave.
La "ID de clave" utilizada para la clave RSA en GPG/PGP son los últimos 8 dígitos hexadecimales del módulo de la clave.
Otras formas de palabra: 'últimos 8 dígitos hexadecimales' -> 'del los últimos 4 bytes 'y' módulo de la clave '->' huella digital (MD5 o SHA-1 hash) de la clave '(dos espacios para los saltos de línea que no funcionan) ¿comentarios?) – Rondo
Habiendo hecho esto para mis propios fines, voy a escribir esto mientras todo está fresco en mi cabeza ...
El ID de la llave "oficial" (es decir, el contenido de la "X509v3 Asunto La extensión Key Identifier "en un certificado X509) es el hash SHA1 de la secuencia ASN.1 codificada en DER que consiste en el módulo y el exponente de una clave pública RSA. Se necesita unir tres diferentes RFCs y un poco de experimentación para llegar a eso, pero así es como funciona.
Algunos código Ruby para hacer la codificación se parece a esto - e introduzca una RSA pública o clave privada en la entrada estándar:
require 'openssl'
pkey = OpenSSL::PKey::RSA.new($stdin.read).public_key
seq = OpenSSL::ASN1::Sequence([OpenSSL::ASN1::Integer.new(pkey.n),
OpenSSL::ASN1::Integer.new(pkey.e)])
puts Digest::SHA1.hexdigest(seq.to_der).upcase.scan(/../).join(':')
En el caso de la Strongswan uno puede mostrar lo que se refiere a como el keyid
usando sus utilidades de línea de comando. El punto principal de keyid
es que se puede usar para identificar la clave pública real contenida en un certificado para que un certificado pueda cambiar, pero al marcar el keyid se puede verificar si la clave ha cambiado o no.
El comando pki
mostrará una lista de los keyids de un certificado X.509 de la siguiente manera (en el que el subjectPublicKeyInfo hash
es el keyid
):
pki --keyid --in cert.pem --type x509
o para una clave privada RSA:
pki --keyid --in key.pem
El segundo comando es ipsec
que se puede usar para enumerar todos los certs (y config) instalados en los subdirectorios /etc/ipsec.d
(este comando listará los certificados y sus correspondientes keyid
lo que es lo mismo que su subjectPublicKeyInfo hash
enumerado por el comando pki
):
ipsec listall
También se puede utilizar openssl
para generar la idea de strongSwan de un keyid
, que es básicamente el SHA1 de la clave pública real RSA (el guión sed
solo priva a los '----- BEGIN CLAVE PÚBLICA -----' y pancartas End) [corrige después de Miqueas comentario]:
openssl x509 -in cert.pem -noout -pubkey | sed 's/--.*$//g' | base64 --decode | sha1sum
El comando openssl tal como está escrito no funciona. Antes de llamar a sha1sum, primero debe decodificar los datos de base64 en binario, de la siguiente manera: 'openssl x509 -in cert.pem -noout -pubkey | sed '/--.*$// g' | base64 --decode | sha1sum' –
- 1. Abrir una clave privada RSA de Ruby
- 2. Convertir clave pública RSA a RSA DER
- 3. Uso de una clave pública de RSA para descifrar una cadena cifrada con la clave privada de RSA
- 4. ssh-rsa validación de clave pública utilizando una expresión regular
- 5. Asegurar una clave de licencia de claves RSA con
- 6. Qué tan malo es 3 como exponente público de RSA
- 7. Encriptación de la clave AES con la clave pública RSA
- 8. Cómo leer una clave privada RSA PEM de .NET
- 9. Cómo obtener el tamaño de una clave RSA en Java
- 10. Cómo almacenar una clave pública en un contenedor de clave RSA a nivel de máquina
- 11. Encriptación RSA en C#: ¿Qué parte define la clave pública?
- 12. ¿Qué es una clave "opaca"?
- 13. ¿Sufijo de identificación del paquete? ¿Qué es?
- 14. ¿Qué es una identificación de versión en serie?
- 15. Tamaño de firma RSA?
- 16. Encriptación con clave privada RSA en Java
- 17. Extraer datos de la clave pública de RSA
- 18. Generar clave privada RSA en C#
- 19. ¿Puedo probar la autenticación con una clave RSA localmente?
- 20. ¿Cómo convierto una clave XML RSA en un archivo PEM?
- 21. Cifrado RSA usando la clave pública
- 22. Intentando comprender el tamaño de la clave Java RSA
- 23. ¿Qué es exactamente una clave externa?
- 24. Cómo recuperar una clave pública RSA de una matriz de bytes []?
- 25. ¿Qué sucede si necesito una identificación de autoincrement muy grande?
- 26. Flash SecureSocket y la clave privada de RSA
- 27. ¿Qué tamaño de bloque máximo de RSA codificar?
- 28. ¿Qué longitud de clave RSA debería usar para mis certificados SSL?
- 29. ¿es esta una forma correcta de generar claves rsa?
- 30. JSON: elementos clave por identificación o no?
En realidad, existe un concepto de "identificador de clave" para X.509: es una secuencia de bytes opacos que puede incluir en una extensión de certificado ("Identificador de clave de sujeto"); también puede incluir el identificador de clave de la CA ("Identificador de clave de autoridad") y el objetivo es ayudar en la creación de rutas. X.509 no ordena ninguna forma específica de generar un identificador de clave, podría tratarse de bytes aleatorios (pero sugiere _ usando un valor hash calculado sobre la clave pública). Los identificadores clave son opcionales. –
@Thomas Excelente, gracias por el recordatorio! De hecho existen extensiones de identificador de clave. Sin embargo, en la práctica, lo que muestra el software y la gente hace referencia a él suele ser el hash SHA1 de la clave. * Fingerprint * es otro sinónimo. –