Как сгенерировать сигнатуру XML-контента с помощью алгоритма RSA?
Я хочу сгенерировать подпись Xml-контента с текущей датой с помощью алгоритма RSA. Я генерирую подпись для Xml с датой при генерации подписи, но получаю несоответствие подписи . Обновил свой код, как показано ниже.
Что я уже пробовал:
My code is as below: <pre> byte[] contentbytes = System.Text.Encoding.UTF8.GetBytes(content + CurrentDate); string contentdatatag = "<![CDATA[" + content + "]]>"; //string decodedxml = HttpUtility.HtmlDecode(contentdatatag); //string decodedxml = contentdatatag.Replace("<", "<").Replace(">", ">"); XmlNodeList elemList = xmlDoc2.GetElementsByTagName("content"); elemList[0].InnerText = contentdatatag; XmlNodeList elemList1 = xmlDoc2.GetElementsByTagName("date"); elemList1[0].InnerText = CurrentDate; //content = content + elemList1[0].InnerText; //string content = System.IO.File.ReadAllText(ToSignFilePath); ASCIIEncoding ByteConverter = new ASCIIEncoding(); Stream mStream1 = new MemoryStream(contentbytes); string sign = Getsignature(pfxFilePath, "1", mStream1, xmlDoc2);
// bool isValid = privateKey1. VerifyData(данные, "SHA256", подпись);
возврат signedBlock4.Метод toString();
}
private string Getsignature(string path, string password, Stream Data,XmlDocument xmlDoc2) { string signedBlock4 = string.Empty; var collection = new X509Certificate2Collection(); collection.Import(path, password, X509KeyStorageFlags.PersistKeySet); var certificate = collection[0]; bool pvtKeyExists = certificate.HasPrivateKey; if (pvtKeyExists == true) { var privateKey = certificate.PrivateKey as RSACryptoServiceProvider; // Force use of the Enhanced RSA and AES Cryptographic Provider with openssl-generated SHA256 keys var enhCsp = new RSACryptoServiceProvider().CspKeyContainerInfo; var cspparams = new CspParameters(enhCsp.ProviderType, enhCsp.ProviderName, privateKey.CspKeyContainerInfo.KeyContainerName); privateKey = new RSACryptoServiceProvider(cspparams); //var signature = privateKey.SignData(Data, "SHA1"); var signature = privateKey.SignData(Data, "SHA256"); signedBlock4 = Convert.ToBase64String(signature); XmlNodeList elemList = xmlDoc2.GetElementsByTagName("signature"); elemList[0].InnerText = signedBlock4; } <pre>
Kornfeld Eliyahu Peter
Дата постоянно меняется?
[no name]
Да, дата берется в момент генерации подписи, и мы подписываем необходимый Xml-контент с датой создания подписи(DateTime. Now)