Megosztás a következőn keresztül:


A titkosítás, a digitális aláírások és a kivonatoló algoritmusok áttekintése a .NET-ben

Ez a cikk áttekintést nyújt a .NET által támogatott titkosítási módszerekről és eljárásokról, beleértve a ClickOnce-jegyzékeket is.

A titkosítás bemutatása

Az olyan nyilvános hálózatok, mint az internet, nem biztosítják az entitások közötti biztonságos kommunikációt. Az ilyen hálózatokon keresztüli kommunikációt illetéktelen harmadik felek olvasására vagy módosítására is érzékenyen használják. A titkosítás segít megvédeni az adatokat a megtekintéstől, módot biztosít az adatok módosításának észlelésére, és biztonságos kommunikációs módot biztosít az egyébként nem biztonságos csatornákon keresztül. Az adatok titkosíthatók például titkosítási algoritmussal, titkosított állapotban továbbítva, majd később a cél fél által visszafejtve. Ha egy harmadik fél elfogja a titkosított adatokat, nehéz lesz megfejteni.

A .NET-ben a System.Security.Cryptography névtér osztályai a titkosítás számos részletét kezelik. Néhány burkoló az operációs rendszer implementációihoz, míg mások tisztán felügyelt implementációk. Ezeknek az osztályoknak a használatához nem kell titkosítási szakértőnek lennie. Amikor létrehoz egy új példányt az egyik titkosítási algoritmusosztályból, a rendszer automatikusan létrehozza a kulcsokat a könnyű használat érdekében, és az alapértelmezett tulajdonságok a lehető legbiztonságosabbak és biztonságosak.

Kriptográfiai primitívek

Egy tipikus helyzetben, ahol titkosítást használnak, két fél (Alice és Bob) kommunikál egy nem biztonságos csatornán keresztül. Alice és Bob szeretné biztosítani, hogy a kommunikáció továbbra is érthetetlen bárki, aki esetleg figyel. Továbbá, mivel Alice és Bob távoli helyeken vannak, Alice-nek gondoskodnia kell arról, hogy a Bobtól kapott információkat senki ne módosítsa az átvitel során. Emellett meg kell győződnie arról, hogy az információk valóban Bobtól származnak, és nem olyantól, aki Megszemélyesíti Bobot.

A titkosítás a következő célok eléréséhez használható:

  • Bizalmasság: A felhasználó identitásának vagy adatainak olvasásának védelme.

  • Adatintegritás: Az adatok módosítása elleni védelem érdekében.

  • Hitelesítés: Annak biztosítása, hogy az adatok egy adott féltől származnak.

  • Nem megtagadás: Annak megakadályozása, hogy egy adott fél megtagadja az üzenet küldését.

Ezeknek a céloknak a eléréséhez az algoritmusok és a titkosítási primitívek néven ismert eljárások kombinációjával hozhat létre titkosítási sémát. Az alábbi táblázat a titkosítási primitíveket és azok használatát sorolja fel.

Kriptográfiai primitív Használat
Titkos kulcs titkosítása (szimmetrikus titkosítás) Átalakítást hajt végre az adatokon, hogy ne olvassák el harmadik felek. Ez a titkosítási típus egyetlen megosztott titkos kulcsot használ az adatok titkosításához és visszafejtéséhez.
Nyilvános kulcsú titkosítás (aszimmetrikus titkosítás) Átalakítást hajt végre az adatokon, hogy ne olvassák el harmadik felek. Ez a titkosítási típus egy nyilvános/titkos kulcspárt használ az adatok titkosításához és visszafejtéséhez.
Titkosítási aláírás Az adott fél számára egyedi digitális aláírás létrehozásával ellenőrizheti, hogy az adatok egy adott féltől származnak-e. Ez a folyamat kivonatfüggvényeket is használ.
Titkosítási kivonatok Térképek adatokat bármilyen hossztól rögzített hosszúságú bájtsorig. A kivonatok statisztikailag egyediek; egy másik két bájtos sorozat nem lesz ugyanahhoz az értékhez kivonatot adni.

Titkos kulcs titkosítása

A titkos kulcs titkosítási algoritmusai egyetlen titkos kulcsot használnak az adatok titkosításához és visszafejtéséhez. A kulcsot illetéktelen ügynököknek kell biztosítaniuk a hozzáféréstől, mert bármely olyan fél, amely rendelkezik a kulccsal, visszafejtheti az adatokat, vagy titkosíthatja a saját adatait, és azt állíthatja, hogy öntől származik.

A titkos kulcs titkosítását szimmetrikus titkosításnak is nevezik, mivel ugyanazt a kulcsot használják titkosításhoz és visszafejtéshez. A titkos kulcsú titkosítási algoritmusok nagyon gyorsak (összehasonlítva a nyilvános kulcsú algoritmusokkal), és kiválóan alkalmasak titkosítási átalakítások végrehajtására nagy adatstreameken. Az olyan aszimmetrikus titkosítási algoritmusok, mint például az RSA, matematikailag korlátozottak abban a mennyiségben, amennyit titkosíthatnak. A szimmetrikus titkosítási algoritmusok általában nem rendelkeznek ezekkel a problémákkal.

A blokkok titkosításának nevezett titkos kulcsú algoritmusok segítségével egyszerre egy adatblokkot titkosíthat. Az olyan titkosítási blokkok, mint a Data Encryption Standard (DES), a TripleDES és az Advanced Encryption Standard (AES) kriptográfiailag átalakítanak egy n bájtból álló bemeneti blokkot titkosított bájtok kimeneti blokkjába. Ha bájtok sorozatát szeretné titkosítani vagy visszafejteni, blokkonként kell blokkolnia. Mivel n kicsi (DES és TripleDES esetén 8 bájt; 16 bájt [az alapértelmezett], 24 bájt vagy 32 bájt az AES esetében), az n-nél nagyobb adatértékeket egyszerre egy blokkban kell titkosítani. Az n-nél kisebb adatértékeket ki kell bontani n értékre a feldolgozáshoz.

A blokkok titkosításának egyik egyszerű formája az elektronikus kódkönyv (EKB) mód. Az EKB mód nem tekinthető biztonságosnak, mert nem használ inicializálási vektort az első egyszerű szöveges blokk inicializálásához. Egy adott k titkos kulcs esetében az inicializálási vektort nem használó egyszerű blokk-titkosítás ugyanazt a bemeneti blokkot titkosítja az egyszerű szöveg ugyanazon kimeneti blokkjába. Ezért ha duplikált blokkok vannak a bemeneti egyszerű szöveges streamben, akkor a kimeneti rejtjelfolyamban duplikált blokkok lesznek. Ezek a duplikált kimeneti blokkok figyelmeztetik az illetéktelen felhasználókat a gyenge titkosításra, az esetleg alkalmazott algoritmusokat és a lehetséges támadási módokat használták. Az EKB titkosítási módja ezért meglehetősen sebezhető az elemzéssel, és végső soron a kulcsfelderítéssel szemben.

Az alaposztálytárban megadott blokkfelhőosztályok a titkosítási blokkláncolás (CBC) nevű alapértelmezett láncolási módot használják, de igény szerint módosíthatja ezt az alapértelmezett beállítást.

A CBC-titkosítások egy inicializálási vektor (IV) használatával oldják meg az EKB-titkosításokkal kapcsolatos problémákat az egyszerű szöveg első blokkjának titkosításához. Minden további egyszerű szöveges blokk bitenkénti kizárólagos VAGY (XOR) műveleten megy keresztül az előző rejtjelszöveg-blokktal, mielőtt titkosítanák. Ezért minden titkosítószöveg-blokk az összes korábbi blokktól függ. A rendszer használata esetén a jogosulatlan felhasználók által ismert gyakori üzenetfejlécek nem használhatók kulcs visszafejtésére.

A CBC-titkosítással titkosított adatok veszélyeztetésének egyik módja, ha minden lehetséges kulcs teljes körű keresését hajtja végre. A titkosítás végrehajtásához használt kulcs méretétől függően ez a fajta keresés nagyon időigényes még a leggyorsabb számítógépek használatával is, ezért nem valósítható meg. A nagyobb kulcsméreteket nehezebb megfejteni. Bár a titkosítás elméletileg nem teszi lehetetlenné a támadó számára a titkosított adatok lekérését, ez növeli ennek költségeit. Ha három hónapig tart a teljes körű keresés a csak néhány napig jelentőséggel bíró adatok lekéréséhez, a teljes keresési módszer nem praktikus.

A titkos kulcsos titkosítás hátránya, hogy feltételezi, hogy két fél megállapodott a kulcsról és a IV-ről, és közli az értékeiket. A IV nem minősül titkos kódnak, és egyszerű szöveges üzenetben továbbítható az üzenettel. A kulcsot azonban titokban kell tartani a jogosulatlan felhasználók elől. Ezen problémák miatt a titkos kulcs titkosítását gyakran használják a nyilvános kulcs titkosításával együtt a kulcs és a IV értékeinek privát kommunikációjára.

Feltételezve, hogy Alice és Bob két fél, akik nem biztonságos csatornán keresztül szeretnének kommunikálni, az alábbiak szerint használhatják a titkos kulcs titkosítását: Alice és Bob megállapodnak abban, hogy egy adott algoritmust (például az AES-t) használnak egy adott kulccsal és IV-szel. Alice összeállít egy üzenetet, és létrehoz egy hálózati streamet (esetleg egy elnevezett csövet vagy hálózati e-mailt), amelyen elküldheti az üzenetet. Ezután titkosítja a szöveget a kulccsal és az IV-sel, majd elküldi a titkosított üzenetet és a IV-et Bobnak az intraneten keresztül. Bob megkapja a titkosított szöveget, és visszafejti azt a IV és a korábban elfogadott kulcs használatával. Ha az átvitel elfogva van, az elfogó nem tudja helyreállítani az eredeti üzenetet, mert nem ismerik a kulcsot. Ebben a forgatókönyvben csak a kulcsnak kell titkosnak maradnia. Egy valós forgatókönyvben Alice vagy Bob létrehoz egy titkos kulcsot, és nyilvános kulcsú (aszimmetrikus) titkosítással továbbítja a titkos (szimmetrikus) kulcsot a másik félnek. A nyilvános kulcsú titkosítással kapcsolatos további információkért lásd a következő szakaszt.

A .NET a következő osztályokat biztosítja, amelyek titkos kulcsú titkosítási algoritmusokat implementálnak:

  • Aes

  • HMACSHA256HMACSHA512és HMACSHA384 . (Ezek technikailag titkos kulcsú algoritmusok, mivel az üzenethitelesítési kódokat jelölik, amelyeket titkos kulccsal kombinált titkosítási kivonatoló függvény használatával számítunk ki. Lásd: Kivonatértékek, a cikk későbbi részében.)

Nyilvános kulcsú titkosítás

A nyilvános kulcs titkosítása olyan titkos kulcsot használ, amelyet titokban kell tartani a jogosulatlan felhasználók elől, és egy nyilvános kulcsot, amely bárki számára nyilvánossá tehető. A nyilvános kulcs és a titkos kulcs matematikailag össze van kapcsolva; A nyilvános kulccsal titkosított adatok csak a titkos kulccsal fejthetők vissza, a titkos kulccsal aláírt adatok pedig csak a nyilvános kulccsal ellenőrizhetők. A nyilvános kulcs bárki számára elérhetővé tehető; a titkos kulcs őrzőjének küldendő adatok titkosítására szolgál. A nyilvános kulcsú titkosítási algoritmusokat aszimmetrikus algoritmusoknak is nevezik, mivel az adatok titkosításához egy kulcsra, az adatok visszafejtéséhez pedig egy másik kulcsra van szükség. Egy alapszintű titkosítási szabály tiltja a kulcsok újrafelhasználását, és mindkét kulcsnak egyedinek kell lennie minden kommunikációs munkamenethez. A gyakorlatban azonban az aszimmetrikus kulcsok általában hosszú élettartamúak.

Két fél (Alice és Bob) az alábbiak szerint használhatja a nyilvános kulcsú titkosítást: Először Alice létrehoz egy nyilvános/titkos kulcspárt. Ha Bob titkosított üzenetet szeretne küldeni Alice-nek, megkéri a nyilvános kulcsára. Alice egy nem biztonságos hálózaton keresztül küldi el Bobnak a nyilvános kulcsát, és Bob ezzel a kulccsal titkosítja az üzeneteket. Bob elküldi a titkosított üzenetet Alice-nek, és visszafejti a titkos kulcsával. Ha Bob megkapta Alice kulcsát egy nem biztonságos csatornán, például egy nyilvános hálózaton keresztül, Bob nyitott a középen belüli támadásra. Ezért Bobnak ellenőriznie kell Alice-szel, hogy rendelkezik-e a nyilvános kulcsának megfelelő másolatával.

Alice nyilvános kulcsának átvitele során egy jogosulatlan ügynök elfoghatja a kulcsot. Ezenkívül ugyanez az ügynök elfoghatja a titkosított üzenetet Bobtól. Az ügynök azonban nem tudja visszafejteni az üzenetet a nyilvános kulccsal. Az üzenet csak Alice titkos kulcsával fejthető vissza, amely nem lett továbbítva. Alice nem használja a titkos kulcsát a Bobnak küldött válaszüzenet titkosításához, mert bárki, aki rendelkezik nyilvános kulccsal, visszafejtheti az üzenetet. Ha Alice vissza szeretne küldeni egy üzenetet Bobnak, megkéri Bobot a nyilvános kulcsára, és ezzel a nyilvános kulccsal titkosítja az üzenetét. Bob ezután visszafejti az üzenetet a társított titkos kulcsával.

Ebben a forgatókönyvben Alice és Bob nyilvános kulcsú (aszimmetrikus) titkosítással továbbít egy titkos (szimmetrikus) kulcsot, és titkos kulcs titkosítást használ a munkamenet hátralévő részében.

Az alábbi lista a nyilvános kulcsú és a titkos kulcsú titkosítási algoritmusok összehasonlítását tartalmazza:

  • A nyilvános kulcsú titkosítási algoritmusok rögzített pufferméretet használnak, míg a titkos kulcsú titkosítási algoritmusok változó hosszúságú puffert használnak.

  • A nyilvános kulcsú algoritmusok nem használhatók arra, hogy az adatokat úgy láncolják streamekbe, ahogyan a titkos kulcsú algoritmusok képesek, mert csak kis mennyiségű adat titkosítható. Ezért az aszimmetrikus műveletek nem ugyanazt a streamelési modellt használják, mint a szimmetrikus műveletek.

  • A nyilvános kulcs titkosítása sokkal nagyobb kulcstérrel (a kulcs lehetséges értékeinek tartományával) rendelkezik, mint a titkos kulcs titkosítása. Ezért a nyilvános kulcs titkosítása kevésbé érzékeny a minden lehetséges kulcsot kipróbáló teljes támadásokra.

  • A nyilvános kulcsok könnyen terjeszthetők, mert nem kell őket biztonságossá tenni, feltéve, hogy létezik valamilyen mód a feladó személyazonosságának ellenőrzésére.

  • Egyes nyilvános kulcsú algoritmusok (például RSA és DSA, de a Diffie-Hellman nem) digitális aláírások létrehozására használhatók az adatok feladójának személyazonosságának ellenőrzéséhez.

  • A nyilvános kulcsú algoritmusok nagyon lassúak a titkos kulcsú algoritmusokhoz képest, és nem nagy mennyiségű adat titkosítására lettek kialakítva. A nyilvános kulcsú algoritmusok csak nagyon kis mennyiségű adat átviteléhez hasznosak. A nyilvános kulcsos titkosítás általában egy kulcs titkosítására szolgál, a TITKOS KULCS algoritmus által használt IV pedig. A kulcs és a IV átvitele után a rendszer titkos kulcs titkosítást használ a munkamenet hátralévő részében.

A .NET a következő osztályokat biztosítja, amelyek nyilvános kulcsú algoritmusokat implementálnak:

Az RSA lehetővé teszi a titkosítást és az aláírást is, de a DSA csak aláíráshoz használható. A DSA nem olyan biztonságos, mint az RSA, ezért az RSA használatát javasoljuk. A Diffie-Hellman csak kulcsgeneráláshoz használható. A nyilvános kulcsú algoritmusok általában korlátozottabbak a használatukban, mint a titkos kulcsú algoritmusok.

Digitális aláírások

A nyilvános kulcsú algoritmusok digitális aláírások létrehozásához is használhatók. A digitális aláírások hitelesítik a feladó identitását (ha megbízik a feladó nyilvános kulcsában), és segítenek megvédeni az adatok integritását. Alice által létrehozott nyilvános kulccsal Alice adatainak címzettje ellenőrizheti, hogy Alice küldte-e, ha összehasonlítja a digitális aláírást Alice adataival és Alice nyilvános kulcsával.

Ha nyilvános kulcsú titkosítást szeretne használni az üzenetek digitális aláírásához, Alice először egy kivonatoló algoritmust alkalmaz az üzenetre egy üzenetkivonat létrehozásához. Az üzenetkivonat az adatok kompakt és egyedi ábrázolása. Alice ezután titkos kulcsával titkosítja az üzenetkivonatot, hogy létrehozza a személyes aláírását. Amikor megkapta az üzenetet és az aláírást, Bob alice nyilvános kulcsával visszafejti az aláírást az üzenet kivonatának helyreállításához, és ugyanazzal a kivonatoló algoritmussal kivonatozza az üzenetet, amelyet Alice használt. Ha a Bob által kiszámított üzenet pontosan egyezik az Alice által kapott üzenetkivonattal, Bob biztos abban, hogy az üzenet a titkos kulcs tulajdonosától származik, és hogy az adatok nem módosultak. Ha Bob bízik abban, hogy Alice a titkos kulcs birtokosa, tudja, hogy az üzenet Alice-től származik.

Feljegyzés

Az aláírást bárki ellenőrizheti, mert a feladó nyilvános kulcsa általános ismeretekkel rendelkezik, és általában a digitális aláírás formátumában szerepel. Ez a módszer nem őrzi meg az üzenet titkosságát; ahhoz, hogy az üzenet titkos legyen, azt is titkosítva kell lennie.

A .NET a következő osztályokat biztosítja, amelyek digitális aláírási algoritmusokat implementálnak:

Kivonatértékek

A kivonatoló algoritmusok tetszőleges hosszúságú bináris értékeket képeznek le rögzített hosszúságú kisebb bináris értékekre, más néven kivonatértékekre. A kivonatérték egy adatrész numerikus ábrázolása. Ha egy egyszerű szöveg bekezdését kivonatozza, és a bekezdés egy betűje is megváltozik, a későbbi kivonat más értéket fog eredményezni. Ha a kivonat kriptográfiailag erős, az értéke jelentősen megváltozik. Ha például egy üzenet egyetlen bitje módosul, egy erős kivonatoló függvény 50%-kal eltérő kimenetet eredményezhet. Sok bemeneti érték kivonatolódhat ugyanahhoz a kimeneti értékhez. Számításilag azonban nem lehet két különböző bemenetet találni, amelyek ugyanahhoz az értékhez kivonatolnak.

Két fél (Alice és Bob) használhat egy kivonatfüggvényt az üzenet integritásának biztosítására. Kiválasztanak egy kivonatoló algoritmust az üzeneteik aláírásához. Alice egy üzenetet írna, majd a kiválasztott algoritmussal létrehozna egy kivonatot az üzenetről. Ezután a következő módszerek egyikét követik:

  • Alice elküldi a egyszerű szöveges üzenetet és a kivonatolt üzenetet (digitális aláírás) Bobnak. Bob fogadja és kivonatozza az üzenetet, és összehasonlítja a kivonat értékét az Alice-től kapott kivonat értékkel. Ha a kivonat értékei azonosak, az üzenet nem módosult. Ha az értékek nem azonosak, az üzenet alice írása után módosult.

    Sajnos ez a módszer nem állapítja meg a feladó hitelességét. Bárki megszemélyesítheti Alice-t, és üzenetet küldhet Bobnak. Ugyanazt a kivonatoló algoritmust használhatják az üzenet aláírásához, és Bob csak azt tudja megállapítani, hogy az üzenet megegyezik az aláírásával. Ez egy középen belüli támadás egyik formája. További információkért lásd a titkosítás következő generációjának (CNG) biztonságos kommunikációs példáját.

  • Alice egyszerű szöveges üzenetet küld Bobnak egy nem biztonságos nyilvános csatornán keresztül. Egy biztonságos magáncsatornán keresztül küldi el a kivonatolt üzenetet Bobnak. Bob megkapja a egyszerű szöveges üzenetet, kivonatozza, és összehasonlítja a kivonatot a privátan kicserélt kivonatokkal. Ha a kivonatok egyeznek, Bob két dolgot tud:

    • Az üzenet nem módosult.

    • Az üzenet feladója (Alice) hiteles.

    Ahhoz, hogy ez a rendszer működjön, Alice-nek el kell rejtenie az eredeti kivonat értékét az összes fél elől, kivéve Bobot.

  • Alice egy nem biztonságos nyilvános csatornán keresztül küldi el a sima szöveges üzenetet Bobnak, és a kivonatolt üzenetet a nyilvánosan megtekinthető webhelyen helyezi el.

    Ez a módszer megakadályozza az üzenetek illetéktelen módosítását azáltal, hogy megakadályozza, hogy bárki módosítsa a kivonat értékét. Bár az üzenetet és kivonatát bárki elolvashatja, a kivonat értékét csak Alice módosíthatja. Egy támadónak, aki meg akarja megszemélyesíteni Alice-t, hozzáférésre lenne szüksége Alice webhelyéhez.

Az előző metódusok egyike sem akadályozza meg, hogy valaki elolvassa Alice üzeneteit, mert a rendszer egyszerű szövegként továbbítja őket. A teljes biztonság általában digitális aláírást (üzenetaláírást) és titkosítást igényel.

A .NET a kivonatoló algoritmusokat implementáló alábbi osztályokat biztosítja:

A .NET is biztosít MD5 és SHA1. Az MD5 és az SHA-1 algoritmusok azonban nem biztonságosak, ezért az SHA-2 használata ajánlott. Az SHA-2 tartalmazza az SHA256, az SHA384 és az SHA512 elemet.

Véletlenszerű szám generálása

A véletlenszerű számgenerálás számos titkosítási művelet szerves része. A titkosítási kulcsoknak például a lehető leg véletlenszerűnek kell lenniük, hogy ne lehessen reprodukálni őket. A kriptográfiai véletlenszerű számgenerátoroknak olyan kimenetet kell létrehozniuk, amely számításilag nem kiszámíthatatlan a felénél nagyobb valószínűséggel történő előrejelzéshez. Ezért a következő kimeneti bit előrejelzésének bármely módszere nem lehet jobb, mint a véletlenszerű találgatás. A .NET-osztályok véletlenszerű számgenerátorokkal hoznak létre titkosítási kulcsokat.

Az RandomNumberGenerator osztály egy véletlenszerű számgeneráló algoritmus implementációja.

ClickOnce-jegyzékek

A következő titkosítási osztályok segítségével lekérheti és ellenőrizheti a ClickOnce technológiával üzembe helyezett alkalmazások jegyzék-aláírásainak adatait:

Emellett a következő osztályok konkrét aláírási információkat is biztosítanak:

Titkosítási következő generációs (CNG) osztályok

A titkosítási következő generációs (CNG) osztályok felügyelt burkolót biztosítanak a natív CNG-függvények köré. (A CNG a CryptoAPI helyettesítése.) Ezeknek az osztályoknak a neveikben szerepel a "Cng". A CNG burkolóosztályok központi eleme a CngKey kulcstároló osztály, amely elvonja a CNG-kulcsok tárolását és használatát. Ez az osztály lehetővé teszi egy kulcspár vagy nyilvános kulcs biztonságos tárolását, és egyszerű sztringnév használatával hivatkozhat rá. A három görbealapú ECDsaCng aláírási osztály és a titkosítási ECDiffieHellmanCng osztály objektumokat használhat CngKey .

Az CngKey osztály számos további művelethez használható, beleértve a kulcsok megnyitását, létrehozását, törlését és exportálását. Emellett hozzáférést biztosít a mögöttes kulcsleíróhoz, amelyet a natív függvények közvetlen meghívásakor használhat.

A .NET emellett számos CNG-osztályt is tartalmaz, például a következőket:

Lásd még