Создать подпись RSA из стороннего ключа в сертификате - PullRequest
0 голосов
/ 03 апреля 2019

ТРЕБОВАНИЕ Наш веб-сайт будет отправлять наших клиентов на сторонние веб-сайты, и третьи стороны требуют, чтобы мы: • Создали подпись RSA, сгенерированную нами значением токена, который мы создадим, который состоит из (метка времени + «|» + политикаNumber) и передайте это в строке запроса url во время перенаправления.При создании подписи мы будем использовать уникальный сертификат, который будет предоставлен третьей стороной, содержащий соответствующий ключ, который будет использоваться при подписании.• Затем третья сторона проверит подпись и получит данные из токена.

. У меня есть код, работающий для токена, создающего подпись и проверяющего ее, см. Приведенный ниже код EX-A с ключом .NET, генерирующим RSA..

У нас пока нет сертификата от третьего лица с ключом.Поскольку я новичок в этом, я хочу подготовиться к кодированию, чтобы использовать ключ, который они предоставляют.У меня есть очень элементарные вопросы, мне нужна помощь и указания, пожалуйста.

ВОПРОСЫ 1. Могу ли я один раз извлечь их ключ и поместить его в постоянную переменную C #, скомпилированную dll для использования на веб-сайте?
Если это так, как бы я изменил кодниже, чтобы использовать этот ключ?
2. Если невозможно выполнить однократное извлечение - должно ли оно храниться на веб-сервере и на моем локальном компьютере для запуска моего локального веб-сайта, объясните, пожалуйста, шаги и способы извлечения.Где это должно храниться?Какой тип файла это будет?

Код EX-A Этот код работает просто отлично и использует сгенерированный .NET ключ RSA

открытый класс VfbRSASafeliteCryption {

    public static string SafeliteEncodedSignature(string policyNumber)
    {
        var returnSignature = string.Empty;
        try
        {
            var requestedPolicyNumber = policyNumber;
            if (string.IsNullOrWhiteSpace(requestedPolicyNumber))
            {
                return string.Empty;
            }

            var currentDateTime = DateTime.Now;
            String timeStamp = currentDateTime.ToString("yyyyMMddHHmmss");


            //TOKEN is data to sign.   timestamp+ | + polnum
            String tokenString = timeStamp + "|" + policyNumber;

            // Create a UnicodeEncoder to convert between byte array and string.
            ASCIIEncoding ByteConverter = new ASCIIEncoding();

            // Create byte arrays to hold original, encrypted 
            byte[] originalData = ByteConverter.GetBytes(tokenString);
            byte[] signedData;

            // Create a new instance of the RSACryptoServiceProvider class automatically create a new key-pair.
            RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider();

            // Export the key information to an RSAParameters object.
            // You must pass true to export the private key for signing.
            // However, you do not need to export the private key
            // for verification.
            RSAParameters Key = RSAalg.ExportParameters(true);    //TODO use a key from safelite

            // Hash and sign the data.
            signedData = HashAndSignBytes(originalData, Key);

            // Verify the data 
            if (VerifySignedHash(originalData, signedData, Key))
            {
                //64encode
                returnSignature = Convert.ToBase64String(signedData);

            }
            else
            {
                //todo logging
                return string.Empty;
            }

        }
        catch (Exception ex)
        {
            //todo logging
            return string.Empty;

        }

        return returnSignature;
    }

    public static byte[] HashAndSignBytes(byte[] DataToSign, RSAParameters Key)
    {
        // Create a new instance of RSACryptoServiceProvider using the 
        // key from RSAParameters.
        using (var RSAalg = new RSACryptoServiceProvider())
        {
            try
            {

                RSAalg.ImportParameters(Key);

                // Hash and sign the data. Pass a new instance of SHA1CryptoServiceProvider
                // to specify the use of SHA1 for hashing.
               return RSAalg.SignData(DataToSign, new SHA1CryptoServiceProvider());
                // ALT code below
                // return RSAalg.SignData(DataToSign, CryptoConfig.MapNameToOID("SHA512"));
            }
            catch (CryptographicException e)
            {
                Console.WriteLine(e.Message);

                return null;
            }
            finally
            {
                // Set the keycontainer to be cleared when rsa is garbage collected.
                RSAalg.PersistKeyInCsp = false;
            }
        }
    }

    public static bool VerifySignedHash(byte[] DataToVerify, byte[] SignedData, RSAParameters Key)
    {
        // Create a new instance of RSACryptoServiceProvider using the 
        // key from RSAParameters.
        using (var RSAalg = new RSACryptoServiceProvider())
        {
            try
            {

               RSAalg.ImportParameters(Key);

                // Verify the data using the signature.  Pass a new instance of SHA1CryptoServiceProvider
                // to specify the use of SHA1 for hashing.
                return RSAalg.VerifyData(DataToVerify, new SHA1CryptoServiceProvider(), SignedData);
                //ALT CODE 
                // return RSAalg.VerifyData(DataToVerify, CryptoConfig.MapNameToOID("SHA512"), SignedData);

            }
            catch (CryptographicException e)
            {
                Console.WriteLine(e.Message);

                return false;
            }
            finally
            {
                // Set the keycontainer to be cleared when rsa is garbage collected.
                RSAalg.PersistKeyInCsp = false;
            }
        }
    }
}
...