Причина, по которой подпись DSA здесь не работает, заключается в том, что вы вообще не выполняете DSA. Вы выполняете HMAC-SHA-1, используя содержимое файла ключа в качестве ключа HMAC.
- Считайте ключевые параметры DSA из файла.
В .NET нет встроенной поддержки чтения файлов ключей PEM. Но в вашем заголовке упоминается BouncyCastle, поэтому вы, вероятно, можете адаптировать принятый ответ к Как прочитать закрытый ключ PEM RSA из .NET в DSA (используя PemReader).
В качестве альтернативы вы можете использовать OpenSSL для создания самозаверяющего сертификата на основе этого ключа и поместить ключ сертификата + в PFX. .NET может нормально загружать PFX.
- Заполните объект DSA.
Если вы пойдете по пути PFX, cert.GetDSAPrivateKey()
сделает все правильно (.NET 4.6.2). В версиях старше 4.6.2 вы можете использовать cert.PrivateKey as DSA
, который будет работать только для DSA, совместимого с FIPS 186-2 (DSA был обновлен в FIPS 186-3).
Если вы используете BouncyCastle для чтения ключевых параметров PEM, вы можете придерживаться BouncyCastle или сделать что-то вроде using (DSA dsa = DSA.Create()) { dsa.ImportParameters(parametersFromTheFile); /* other stuff here */ }
. (DSA.Create() предоставит объект, ограниченный FIPS-186-2 в .NET Framework, но может соответствовать FIPS-186-3 в .NET Core).
- Подпишите данные
FIPS-186-2 допускает только SHA-1 в качестве алгоритма хэширования, FIPS-186-3 допускает семейство SHA-2 (SHA256, SHA384, SHA512). Мы предполагаем, что вы используете FIPS-186-2/SHA-1 (если нет, то необходимые замены, надеюсь, очевидны).
BouncyCastle: Однако они вычисляют подписи. (Извините, я не знаком с их API)
.NET 4.6.1 или старше:
using (SHA1 hash = SHA1.Create())
{
signature = dsa.CreateSignature(hash.ComputeHash(dataInBytes));
}
.NET 4.6.2 или новее:
signature = dsa.SignData(dataInBytes, HashAlgorithmName.SHA1);
Мыльница
Затем, когда все сказано и сделано (или, возможно, раньше): спросите себя: «Почему я использую DSA?». В FIPS 186-2 (и более ранних версиях) DSA ограничен размером ключа 1024 бит и хэшем SHA-1. NIST SP800-57 классифицирует SHA-1 и DSA. -1024, оба имеют 80-битную защиту (таблицы 2 и 3). NIST классифицировал 80 бит безопасности как «устаревшие» для 2011–2013 гг. и «запрещенные» для 2014 г. и далее (таблица 4). Современное использование DSA (для объектов, на которые распространяются рекомендации NIST) требует поддержки FIPS-186-3.
ECDSA получает ~keysize/2 бита безопасности; таким образом, самый низкий (обычно поддерживаемый) размер ключа ECDSA (ключи, основанные на NIST P-256/secp256r1) обеспечивает 128-битную безопасность, что NIST оценивает как хорошее для 2031+.
RSA также является лучшим выбором, чем DSA, потому что он имеет гораздо большую поддержку подписей, которые все еще считаются безопасными NIST.
Хотя, если вы соблюдаете протокол, я думаю, вариантов не так много.
person
bartonjs
schedule
22.12.2016