IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Knižnica pre šifrovanie pomocou AES v C # .NET

Pokúšal som sa urobiť si aplikáciu, čo bude vedieť šifrovať dáta, čo ukladá. Zistil som, že v .NET síce sú prostriedky pre šifrovanie, ale je pomerne pracné s nimi robiť bežné veci a sú celkovo ťažkopádne. Preto som si vytvoril knižnicu pre šifrovanie, ktorú som časom výrazným spôsobom vylepšil a zverejnil.

Teraz je v stave, kedy som presvedčený, že všetko funguje, ako má a nikto nemá sa žiadnou časťou problém. Tiež je dôležité, že sa knižnica sama stará o bezpečnostné opatrenia, ktoré by človek asi rád opomenul s tým, že nie sú príliš dôležité alebo ani nevie, že tam majú byť (ja som to treba tiež nevedel).

Funkcie

  • (De) šifrovanie akýchkoľvek serializovatelných objektov na báze XML (obyčajné stringy sú výnimka, nepoužívajú XML)
  • šifrovanie textovým heslom a kľúčom byte[], odvodenie kľúče z heslá
  • dôkladné solenie
  • automatické generovanie nových inicializačných vektorov
  • HMACSHA256 autentizácie a porovnaní v konštantnom čase (je bezpečné to použiť na serveri)
  • autentizácia plaintextu (áno, relatívne zbytočná, ale ono to SHA1 moc dlho netrvá ...)
  • 100% pracuje sa streamy, takže nie je problém zašifrovať veľké súbory pomocou FileStream
  • bez závislostí
  • k dispozícii na nugety

Príklady použitia

Zašifrovanie textu textovým heslom

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šifrovanie textu bytovým kľúčom, ktorý si necháme vygenerovať

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));

Celú dokumentáciu nájdete na GitLabu

Poznámky

  • Formát nie je kompatibilný s ostatnými knižnicami / programy
  • Treba triedy používať v using bloku (alebo podobných konštrukciách). Ak vykonávate šifrovanie raz za beh programu, asi to nebude tak zlé, ale ak budete rekurzívne šifrovať zložku, môžu sa diať nepekné veci (potom samozrejme použite tú istú inštanciu, preto sa to nerobí automaticky)
  • Knižnicu môžete používať aj keď úplne neviete, čo robíte, ale potom sa nepokúšajte robiť niečo ako zmenu dĺžky kľúča (predvolená je 256b)
  • Textové heslo nie je zďaleka tak bezpečné ako kľúč tvorený bitovým poľom, ak nemáte niečo ako 64 znakov dlhé heslo. Heslo používajte iba ak musíte šifrovať heslom, ktoré vám dá užívateľ. Aby sa sťažilo uhádnutie takého heslá, iteruje sa pomerne dlho (kľudne desiatky ms), než z neho vypadne bitové pole - potom tkvie bezpečnosť v tom, že je zložité získať kľúč z heslá. Počet iterácií sa nastavuje ako statická vlastnosť CryptoUtils.Rfc2898DeriveBytesIterations
  • Výstup bude približne 4/3 veľkosti vstupu + hlavičky, pretože sa všetko kóduje do base64
  • Áno, všade inde je iná ikona. To je tak, keď si ukladáte len rozlíšenie, čo potrebujete ...

Galéria


 

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 45x (93.72 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#

 

Všetky články v sekcii
C # - Pre pokročilých
Program pre vás napísal Petr Čech
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje především desktopovým aplikacím v C#, okrajově Javě na Legu NXT.
Aktivity