Маячня програміста Цифровий підпис великих файлів на
Програмування, збочення та все інше
понеділок, 27 травня 2013 р.
Цифровий підпис великих файлів на .NET у потоковому режимі
Стандартний механізм у .NET підпису через SignedCms, дуже симпатичний, але є одна проблема: для підпису необхідно передати масив байт, тобто. якщо треба підписати великий файл, то спочатку прочитати на згадку в .NET потім засунути цей обсяг системному API, що дуже затратно по пам'яті.
Звичайно, у CryptoPro є чудовий метод SignHash, який дозволяє заздалегідь порахувати хеш та його підписати (що ідентично підпису самого файлу), але це тільки у CryptoPro, стандартне API навіть на низькому рівні не дозволяє провести таке.
Гуглення видало код, який може шифрувати в потоковому режимі, але у нього виявилося кілька проблем:
- Чомусь використовується FileStream, хоча досить просто Stream
- Реально все одно читається весь вміст (!), а потім підписується в потоковому режимі
- Немає підтримки Detached підписи, хоча додати його нескладно
- Нахабно з сертифіката береться приватний ключ, який знову ж таки вважається RSA (наївні! зовсім не знають що в Україні твориться)
Загалом, я поправив цей код, і викладаю його тут, бо взяв із блогу вихідники, треба їх так само повернути, щоб людям було приємно.
Код, являє собою компіляцію того, що було, про те, що треба, по-доброму його треба зачесати, але для демонстрації можливостей, піде.