bearer - implementar RSA en.NET core
asp.net core token authentication (2)
Debe evitar el uso de RSACryptoServiceProvider
si puede. Solo funciona en Windows (y es la implementación de RSA menos buena en Windows). Manténgase en la clase base RSA
y cree nuevas instancias a través de RSA.Create()
Llaves efímeras (Creación)
.NET Core
using (RSA rsa = RSA.Create())
{
rsa.KeySize = desiredKeySizeInBits;
// when the key next gets used it will be created at that keysize.
DoStuffWithThePrivateKey(rsa);
}
.NET Framework
Desafortunadamente, el valor predeterminado para RSA.Create () en .NET Framework es RSACryptoServiceProvider, que no respeta set_KeySize. Entonces, si necesita claves efímeras, necesitará usar un código diferente en .NET Framework vs .NET Core:
using (RSA rsa = new RSACng())
{
rsa.KeySize = desiredKeySizeInBits;
DoStuffWithThePrivateKey(rsa);
}
O, si necesita admitir versiones anteriores a 4.6 (donde no existía RSACng) / 4.6.2 (donde la mayoría de .NET Framework funcionó felizmente con los objetos RSACng en lugar de RSACryptoServiceProvider), puede continuar usando la implementación anterior:
using (RSA rsa = new RSACryptoServiceProvider(desiredKeySizeInBits))
{
// Since before net46 the Encrypt/Decrypt, SignData/VerifyData, SignHash/VerifyHash
// methods were not defined at the RSA base class, you might need to keep this strongly
// typed as RSACryptoServiceProvider.
DoStuffWithThePrivateKey(rsa);
}
Llaves efímeras (Importación)
Aunque RSACng, en general, es más fácil trabajar con RSACryptoServiceProvider, RSACryptoServiceProvider debería funcionar bien en este contexto, por lo que RSA.Create () es bueno en todas las plataformas:
using (RSA rsa = RSA.Create())
{
rsa.ImportParameters(rsaParameters);
DoStuffWithWhateverKindOfKeyYouImported(rsa);
}
De un certificado:
.NET Core 1.0+, .NET Framework 4.6+
using (RSA rsa = cert.GetRSAPublicKey())
{
DoStuffWithThePublicKey(rsa);
}
o
using (RSA rsa = cert.GetRSAPrivateKey())
{
DoStuffWithThePrivateKey(rsa);
}
.NET Framework <4.6
// Do NOT put this in a using block, since the object is shared by all callers:
RSA rsaPrivate = (RSA)cert.PrivateKey;
DoStuffWithThePrivateKey(rsaPrivate);
// Do NOT put this in a using block, since the object is shared by all callers:
RSA rsaPublicOnly = (RSA)cert.PublicKey.Key;
DoStuffWithThePublicKey(rsaPublic);
Uso de claves nombradas / persistentes (solo para Windows)
Iba a incluir algunas muestras sobre la creación / apertura de claves con nombre RSACryptoServiceProvider (WinXP + / CAPI) y RSACng (Win7 + / CNG), pero ese no es un escenario muy común en .NET; y ciertamente no es portátil (la portabilidad a otros sistemas operativos es uno de los argumentos más convincentes para .NET Core).
Haciendo referencia a cosas.
Para .NET Core 1.0 y 1.1, obtiene acceso a la clase base RSA desde el paquete System.Security.Cryptography.Algorithms
. En .NET Core 2.0 se incluirá en la referencia del paquete netstandard
.
Si necesita hacer una interoperabilidad compleja con el sistema operativo, puede hacer referencia a System.Security.Cryptography.Cng
(Windows CNG), System.Security.Cryptography.Csp
(Windows CAPI / CryptoServiceProvider), o System.Security.Cryptography.OpenSsl
(Linux OpenSSL , macOS OpenSSL) y obtenga acceso a las clases habilitadas para interoperabilidad (RSACng, RSACryptoServiceProvider, RSAOpenSsl). Pero, en realidad, no deberías hacer eso.
¿Qué devuelve RSA.Create ()?
- .NET Framework: RSACryptoServiceProvider, a menos que lo modifique CryptoConfig.
- .NET Core (Windows): una clase privada que implementa RSA a través de CNG, no se puede convertir a un tipo más específico.
- .NET Core (Linux): una clase privada que implementa RSA a través de OpenSSL, no se puede convertir a un tipo más específico.
- .NET Core (macOS): una clase privada que implementa RSA a través de OpenSSL, no se puede convertir a ningún tipo más específico. (Esto debería ser a través de SecureTransforms en la próxima versión de .NET Core)
Estoy tratando de cifrar y descifrar algunos datos con RSA. Busqué en la clase RSA
pero solo veo la clase abstracta https://msdn.microsoft.com/en-us/library/system.security.cryptography.rsa(v=vs.110).aspx
He leído que la clase RSA en DNX5 es diferente de la de .net 4.6.1 ¿Es una clase diferente a la que estoy viendo? Si es así, ¿dónde puedo encontrar la documentación para usarla? También parece que RSACryptoServiceProvider
no está funcionando en .net core y solo tengo acceso a la clase abstracta RSA
.
Tendrá que usar la biblioteca dotnetcore en su lugar. Agregue el paquete System.Security.Cryptography.Algorithms
Nuget a su proyecto. Lo puedes encontrar aquí: System.Security.Cryptography.Algorithms
Proporciona todos los algoritmos comunes para tu proyecto.
Aquí está la clase RSACryptoServiceProvider que usaría para los métodos Encrypt () y Decrypt ().