[.NET] Novedades de System.Security.Cryptography en el .NET Framework 4.6


En este post veremos las novedades referentes al sistema de criptografía incluido en la versión 4.6 de la plataforma .NET Framework.

Como bien sabemos, .NET Framework nos provee de varias clases que implementan los algoritmos criptográficos más utilizados y en esta versión del Framework posee mejoras para el  soporte para Windows CNG cryptography APIs:

  • Métodos de extensión para usar con certificados X509 en el espacio de nombres System.Security.Cryptography.X509Certificates
    1. GetRSAPublicKey
    2. GetRSAPrivateKey
  • Una nueva clase llamada System.Security.Cryptography.RSACng, que provee una implementación CNG del algoritmo RSA.
  • Mejoras en la API de RSA para que no se use un casting:
    RSA rsa = cert.GetRSAPrivateKey();
    if (rsa == null)
       throw new InvalidOperationException("An RSA certificate was expected");
    
    byte[] oaepEncrypted = rsa.Encrypt(data, RSAEncryptionPadding.OaepSHA1);
    byte[] pkcs1Encrypted = rsa.Encrypt(data, RSAEncryptionPadding.Pkcs1);
    

Actualmente han liberado la RC de la versión 4.6.1 del Framework de .NET cuya novedad en este campo es el soporte para ECDSA (Elliptic Curve Digital Signature Algorithm) X509 certificates que ofrece mejor rendimiento y seguridad que el algoritmo RSA.

El siguiente código de ejemplo muestra lo fácil que es generar una firma digital a un stream de bytes con el nuevo soporte para ECDSA X509 certificates.

using System;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;

public class Net461Code
{
 public static byte[] SignECDsaSha512(byte[] data, X509Certificate2 cert)
 {
    using (ECDsa privateKey = cert.GetECDsaPrivateKey())
    {
      return privateKey.SignData(data, HashAlgorithmName.SHA512);
    }
 }

 public static byte[] SignECDsaSha512(byte[] data, ECDsa privateKey)
 {
     return privateKey.SignData(data, HashAlgorithmName.SHA512);
 }
}

el anterior código en la versión 4.6 quedaría de la siguiente forma

using System;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;

public class Net46Code
{
  public static byte[] SignECDsaSha512(byte[] data, X509Certificate2 cert)
  {
     // This would require using cert.Handle and a series of p/invokes to get at the
     // underlying key, then passing that to a CngKey object, and passing that to
     // new ECDsa(CngKey). It's a lot of work.
     throw new Exception("That's a lot of work...");
  }

  public static byte[] SignECDsaSha512(byte[] data, ECDsa privateKey)
  {
     // This way works, but SignData probably better matches what you want.
     using (SHA512 hasher = SHA512.Create())
     {
        byte[] signature1 = privateKey.SignHash(hasher.ComputeHash(data));
     }

     // This might not be the ECDsa you got!
     ECDsaCng ecDsaCng = (ECDsaCng)privateKey;
     ecDsaCng.HashAlgorithm = CngAlgorithm.Sha512;
     return ecDsaCng.SignData(data);
  }
} 

Ya hemos visto las mejoras en el campo de la criptografía que viene con la versión 4.6 y 4.6.1 del framework.

Saludos

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s