#c# #rsa #x509certificate #sign
#c# #rsa #x509certificate #подписать
Вопрос:
У меня есть веб-сервис, которому требуется подпись тела на всех запросах. итак, мне интересно, какова наилучшая практика для этого? Я использую этот метод для подписи строки, но, думаю, это не лучший способ. потому что мой закрытый ключ никогда не располагает:
using (var provider = new RSACryptoServiceProvider())
{
provider.ImportParameters(ProjectValues.PrivateKey.ExportParameters(true));
encryptByteList = provider.SignData(content, CryptoConfig.MapNameToOID("SHA256"));
}
Я уже прочитал сертификат и закрытый ключ один раз, когда проект загружался в первый раз. Вот так:
Certificate = new X509Certificate2("my pfx path", "***", X509KeyStorageFlags.Exportable);
PrivateKey = (RSACryptoServiceProvider)Certificate.PrivateKey;
Затем я нашел этот метод:
var cert = new X509Certificate2("my pfx path", "***", X509KeyStorageFlags.Exportable);
using (var rsa = cert.GetRSAPrivateKey())
{
encryptByteList = rsa.SignData(content, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
}
но это работает, если я читаю сертификат из файла при каждом запросе. очевидно, что это неэффективный способ
Комментарии:
1. Вы не можете иметь свой пирог и свой пирог тоже. Вы не хотите получать закрытый ключ при каждом запросе, но вы также не хотите сохранять ключ. Это совершенно противоположные требования, и вы не можете иметь оба одновременно.
2. спасибо, дорогой @jdweng. у меня нет проблем с сохранением закрытого ключа. но это доступно, и, насколько я знаю, я не должен был хранить такие объекты. если мой первый метод безопасен, я сохраняю его. но в глубине души я знаю, что должен быть лучший способ.
3. Наилучшая практика — максимально полагаться на безопасность SSL / TLS и делать что-то нестандартное, только если у вас есть уникальные требования, например, неотказуемость.
4. спасибо, дорогой @PresidentJamesK.Polk. но это не мой выбор. поставщик услуг заставляет нас использовать эти новые методы безопасности.