Il parametro D della RSA è abbastanza strong da essere usato come segreto per il calcolo HMAC?

2

Breve domanda: Il parametro D dell'algoritmo RSA è sufficientemente crittograficamente sufficientemente strong da essere utilizzato come chiave segreta per generare un valore hash SHA-256?

Domanda lunga: Sto lavorando su piattaforma Windows. Devo proteggere determinati dati con HMAC. Ho 4 server che devono essere in grado di generare / convalidare valori hmac per determinati dati.

Sto usando questa classe per generare il valore HMAC - link

Richiede segreto. Ovviamente il segreto deve essere condiviso tra tutti e 4 i server. Ho l'obbligo di proteggere questo segreto. Non può essere memorizzato come un file di testo semplice.

Va bene che certi custodi di chiavi accedano a questo segreto ma non a un pubblico più ampio, ad es. manutentori / sviluppatori del sistema.

Ho pensato che potrei usare Windows Certificate Store come meccanismo che protegge la chiave. L'idea sta seguendo

Il custode della chiave genera un certificato autofirmato, lo installa nell'archivio certificati su ciascuno dei 4 server. Dopo aver installato CERT, il custode delle chiavi concede l'accesso al certificato e alla chiave privata a un "utente di sistema" che ospita l'applicazione. Questo viene fatto su ciascun server.

Il certificato viene recuperato in base alle esigenze dell'applicazione e viene privata la chiave privata privata, quindi il valore D di tale chiave privata viene inserito nella calcolatrice hmac come segreto condiviso.

    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));
        }           
    }

quindi viene passato al calcolatore Hmac

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

e l'hash è calcolato

hmac.ComputeHash(data)
    
posta ambidexterous 25.11.2015 - 06:48
fonte

1 risposta

2

Non farlo. No, non va bene.

Quello che stai cercando è proteggere l'integrità di alcuni messaggi. Vorresti usare HMAC, che è l'algoritmo corretto. La domanda è: come collegare RSA e HMAC e tutti i messaggi.

Dovresti utilizzare la firma della chiave pubblica standard.

  1. Genera una chiave HMAC casuale (la dimensione è uguale alla dimensione dell'hash utilizzato per HMAC).
  2. Calcola HMAC (Message, Key_HMAC).
  3. Segno di calcolo (HMAC, Key_RSA).

Pacchetto Messaggio || Key_HMAC || Firma e distribuire secondo necessità.

Per verificare l'integrità, ricalcala HMAC e verifica la firma su di essa.

Ogni server che condivide lo stesso certificato di firma autofirmato è OK. In alternativa, è possibile creare un certificato di origine e fornire quattro certificati di firma firmati ciascuno dal certificato radice, uno per server. Se firmate correttamente il messaggio e lo impacchettate in una busta PKCS, il server che lo ha firmato impacchetterà il suo certificato con la firma e ciascun server potrà verificare separatamente la firma in quanto si fida della radice del certificato allegato. Questo può richiedere molto spazio (la firma PKI può essere grande) per messaggio firmato.

    
risposta data 25.11.2015 - 08:23
fonte

Leggi altre domande sui tag