¿Es el parámetro D del RSA lo suficientemente fuerte como para ser usado como secreto para el cálculo de HMAC?

2

Pregunta corta: ¿Es el parámetro D del algoritmo RSA criptográficamente lo suficientemente fuerte como para ser utilizado como una clave secreta para generar el valor hash SHA-256?

Pregunta larga: Estoy trabajando en la plataforma de windows. Tengo que proteger ciertos datos con HMAC. Tengo 4 servidores que necesitan poder generar / validar valores hmac para ciertos datos.

Estoy usando esta clase para generar el valor HMAC - enlace

Requiere secreto. Obviamente, el secreto debe compartirse entre los 4 servidores. Tengo un requisito para proteger este secreto. No se puede almacenar como un archivo de texto plano.

Está bien que cierto custodio clave acceda a este secreto pero no para una audiencia más amplia, por ejemplo. mantenedores del sistema / desarrolladores.

Pensé que podría usar el almacén de certificados de Windows como un mecanismo que protege la clave. La idea está siguiendo

Key custodian genera un certificado autofirmado, lo instala en el almacén de certificados en cada uno de los 4 servidores. Después de instalar cert, el custodio de claves otorga acceso al certificado y la clave privada a un "usuario del sistema" que hospeda la aplicación. Esto se hace en cada servidor.

El certificado se recupera según sea necesario por la aplicación y la clave privada privada extraída y luego el valor D de esa clave privada se ingresa en la calculadora hmac como secreto compartido.

    private byte[] ExtractPrivateKeyFromCertificate(X509Certificate2 certificate)
    {
        var provider = certificate.PrivateKey as RSACryptoServiceProvider;
        var privateKey = provider?.ExportParameters(true);

        if (privateKey != null)
        {
            var value = privateKey.Value;
            return value.D;
        }
        else
        {
            throw new ArgumentException("Certificate does not contain a private key", nameof(certificate));
        }           
    }

entonces eso se pasa a la calculadora Hmac

var hmac = new HMACSHA256(ExtractPrivateKeyFromCertificate(certificate));

y se calcula el hash

hmac.ComputeHash(data)
    
pregunta ambidexterous 25.11.2015 - 06:48
fuente

1 respuesta

2

No hagas esto. No, no está bien.

Lo que estás buscando es proteger la integridad de algún mensaje. Le gustaría usar HMAC, que es el algoritmo correcto. La pregunta es: cómo vincular RSA y HMAC y todos los mensajes.

Debería usar la firma de clave pública estándar.

  1. Genere una clave HMAC aleatoria (el tamaño es el mismo que el tamaño del hash utilizado para HMAC).
  2. Calcular HMAC (mensaje, clave_HMAC).
  3. Signo de cálculo (HMAC, Key_RSA).

Paquete Mensaje || Key_HMAC || Firma y distribúyalo según sea necesario.

Para verificar la integridad, vuelva a calcular HMAC y verifique la firma sobre él.

Todos los servidores que comparten el mismo certificado de firma autofirmado están bien. O bien, puede crear un certificado raíz y proporcionar cuatro certificados de firma firmados por el certificado raíz, uno por servidor. Si firma correctamente el mensaje y lo empaqueta en un sobre PKCS, el servidor que lo firmó empaquetará su certificado con la firma y cada servidor puede verificar la firma por separado, ya que confía en la raíz del certificado adjunto. Esto puede ocupar mucho espacio (la firma PKI puede ser grande) por mensaje firmado.

    
respondido por el Andrew Philips 25.11.2015 - 08:23
fuente

Lea otras preguntas en las etiquetas