Knihovna pro šifrování pomocí AES v C# .NET
V minulé lekci, Ukázka jednoduché šifrace textu Vigenerova šifra, jsme si ukázali Vigenerovou šifru.
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

Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 45x (93.72 kB)
Aplikace je včetně zdrojových kódů