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#