Získej svůj iPhone v nové soutěži! Získej svůj iPhone v nové soutěži!
Nová překladatelská soutěž ITnetwork.cz o telefon iPhone, sluchátka Beats a další věcné ceny za 4 hodiny práce.
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

Knihovna pro šifrování pomocí AES v C# .NET

C# .NET Pro pokročilé Knihovna pro šifrování pomocí AES v C# .NET

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

Pokoušel jsem se udělat si aplikaci, co bude umět šifrovat data, co ukládá. Zjistil jsem, že v .NETu sice jsou prostředky pro šifrovaní, ale je poměrně pracné s nimi dělat běžné věci a jsou celkově těžkopádné. Proto jsem si vytvořil knihovnu pro šifrování, kterou jsem časem výrazným způsobem vylepšil a zveřejnil.

Nyní je ve stavu, kdy jsem přesvědčen, že vše funguje, jak má a nikdo nemá se žádnou částí problém. Také je důležité, že se knihovna sama stará o bezpečností opatření, která by člověk asi rád opominul s tím, že nejsou příliš důležitá nebo ani neví, že tam mají být (já jsem to třeba také nevěděl).

Funkce

  • (de)šifrování jakýchkoliv serializovatelných objektů na bázi XML (obyčejné stringy jsou výjimka, nepoužívají XML)
  • šifrování textovým heslem a klíčem byte[], odvození klíče z hesla
  • důkladné solení
  • automatické generování nových inicializačních vektorů
  • HMACSHA256 autentizace a porovnání v konstantním čase (je bezpečné to použít na serveru)
  • autentizace plaintextu (ano, relativně zbytečná, ale ono to sha1 moc dlouho netrvá...)
  • 100% pracuje se streamy, takže není problém zašifrovat velké soubory pomocí FileStream
  • bez závislostí
  • k dispozici na NuGetu

Příklady použití

Zašifrování textu textovým heslem
const string password = "42";
string plaintext = "Gravity is a myth, Earth sucks!";
string cipher;
using (var aes = new PasswordAes(password))
    cipher = aes.Encrypt(plaintext);
//dešifrování
using (var aes = new PasswordAes(password))
    Console.WriteLine(aes.Decrypt(cipher));
Zašifrování textu bytovým klíčem, který si necháme vygenerovat
byte[] key;
var plaintext = "Why so serious?";
string cipher;
using (var aes = new AdvancedAes())
{
    //klíč je generovaný automaticky, pokud ho nespecifikujete v konstruktoru
    key = aes.EncryptionKey;
    cipher = aes.Encrypt(plaintext);
}
//dešifrování
using (var aes = new AdvancedAes(key))
    Console.WriteLine(aes.Decrypt(cipher));

Celou dokumentaci najdete na GitLabu

Poznámky

  • Formát není kompatibilní s ostatními knihovnami/programy
  • Je třeba třídy používat v using bloku (nebo podobných konstrukcích). Pokud provádíte šifrování jednou za běh programu, asi to nebude tak špatné, ale pokud budete rekurzivně šifrovat složku, mohou se dít nepěkné věci (potom samozřejmě použijte tu samou instanci, proto se to neprovádí automaticky)
  • Knihovnu můžete používat i když úplně nevíte, co děláte, ale potom se nepokoušejte dělat něco jako změnu délky klíče (výchozí je 256b)
  • Textové heslo není zdaleka tak bezpečné jako klíč tvořen bitovým polem, pokud nemáte něco jako 64 znaků dlouhé heslo. Heslo používejte pouze pokud musíte šifrovat heslem, které vám dá uživatel. Aby se ztížilo uhádnutí takového hesla, iteruje se poměrně dlouho (klidně desítky ms), než z něj vypadne bitové pole - potom tkví bezpečnost v tom, že je složité získat klíč z hesla. Počet iterací se nastavuje jako statická vlastnost CryptoUtils.Rfc2898DeriveBytesIterations
  • Výstup bude přibližně 4/3 velikosti vstupu + hlavičky, protože se vše kóduje do base64
  • Ano, všude jinde je jiná ikona. To je tak, když si ukládáte jen rozlišení, co potřebujete...

Galerie

Program byl vytvořen v roce 2017.

 

Stáhnout

Staženo 5x (93.72 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

 

Program pro vás napsal Petr Čech
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
Autor se věnuje především desktopovým aplikacím v C#, okrajově Javě na Legu NXT.
Aktivity (2)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!