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)