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)