Jste zde

Bezpečnost IoT - část 1: Kryptografie

Počet zařízení, které obsahují připojení k internetu roste raketovou rychlostí. Rychlé sdílení naměřených hodnot přináší výhodu v rychlém zpracování, ale má to i své bezpečnostní rizika. I malé teplotní čidlo připojené k síti může nezvaným hostům otevřít vrátka do celého systému. Proto je nutné používat základní bezpečnostní algoritmy, které jsou efektivní a jejich cena není veliká.

Internet věcí rychle pronikl do všech koutů digitálního světa a stal se běžnou součástí průmyslových lékařských, dopravních a jiných aplikacích. Vnitřní průmyslové sítě jsou běžně důmyslně zabezpečeny, ale problém nastává s rozšířením sítě o zařízení, které nemají dostatečný výkon procesoru pro složité bezpečnostní algoritmy. Hackeři jsou si této zranitelnosti vědomi, a tak připojená zařízení čelí obrovskému počtu hrozeb. Proto je nutné, aby každé zařízení IoT obsahovalo důmyslná bezpečnostní opatření. Proto vznikla série článků pojednávající o různých stupních bezpečnosti Embeded zařízení.

Série článků o bezpečnosti Embeded zařízení:

  • Část 1 pojednává o kryptografických algoritmech, které jsou základem bezpečnosti.
  • Část 2 pojednává o roli soukromých klíčů, správě klíčů a bezpečném uložišti.
  • Část 3 zkoumá mechanismy integrované přímo do procesorů k odrazení útoků na systémové a aplikační části software.
  • Část 4 ukazuje použití bezpečnostního mechanismu přímo v procesorech k zajištění bezpečnosti v runtime režimu.
  • Část 5 popisuje zabezpečení na vyšší úrovni při komunikaci s cloudovými službami.

Může se zdát, že zavedení robustních bezpečnostních opatření pro jednoduché zařízení IoT je zbytečné. Ale i jednoduchá zařízení s teplotními čidly, která nemají dostatečnou ochranu, mohou hackerům poskytnout přístup do podnikových sítí [1]. Ani dostatečný výkon procesoru nezaručuje dostatečnou bezpečnost, jelikož může dojít k chybné implementaci bezpečnostních algoritmů.

Tento článek popisuje základní třídy kryptografických algoritmů a zkoumá jejich roli v bezpečnosti celého systému. Dále sse podíváme na výhody procesorů a specializovaných zařízení - od Maxim Integrated , Microchip Technology a Texas Instruments, které jsou navrženy tak, aby docházelo k rychlému zpracování bezpečnostních algoritmů a jejich snadné implementaci.

Různé typy kryptografických algoritmů a jejich role

Kryptografické algoritmy spadají do tří základních kategorií, které se zabývají bezpečnostními zásadami:

  • důvěrnost
  • autentizace (ověření zdroje zprávy)
  • nepopiratelnost (non-repudiation) - souvisí s autorizací - jedná se o jistotu, že autor dat nemůže své autorství popřít (např. bankovní transakce)
  • integrita

Algoritmy symetrických klíčů - algoritmus používá stejný tajný klíč k zašifrování zprávy čitelné člověkem (holý text) do zašifrované verze (ciphertext) a později pro dešifrování šifry zpět na holý text. K zajištění důvěrnosti se obvykle používají symetrické klíčové šifry. Běžné symetrické kryptografické algoritmy:

  • Triple DES (Data Encryption Standard) známý jako 3DES nebo jako Algoritmus Triple Data Encryption (TDEA).
  • Algoritmy Advanced Encryption Standard (AES) [2], jako je AES-256, který používá 256bitové klíče.

Algoritmy asymetrického klíče – algoritmus používá k šifrování a dešifrování zprávy spárovanou sadu soukromých a veřejných klíčů. Asymetrické šifry se obvykle používají k zajištění důvěrnosti, autentizace nebo nepopiratelnosti. Kryptografické algoritmy veřejných klíčů:

  • Algoritmy využívající kryptografii konečných polí (FFC - ) - Federal Information Processing Standard (FIPS) Digital Signature Algorithm (DSA) a Internet Engineering Task Force (IETF) Diffie-Hellman (DH) [3] pro výměnu klíčů
  • Algoritmy využívající kryptografii s celočíselnou faktorizací (IFC) - Algoritmus RSA (Rivest – Shamir – Adleman) [4]
  • Algoritmy využívající kryptografii eliptické křivky (ECC) - Elliptic Curve Diffie-Hellman (ECDH)[5] key exchange  pro výměnu klíčů a Elliptic Curve Digital Signature Algorithm (ECDSA)[6]

Hash algoritmy - algoritmus redukuje původní zprávu na mnohem menší velikost pevné délky nazývanou hash, digest nebo jednoduše podpis. Tyto jednosměrné konverzní funkce hrají rozhodující roli při ověřování, že zpráva nebyla změněna (tzv. integrita). Tento algoritmus nalezeme v protokolech obsahující ověřovací kód zprávy (MAC - message authentication code), ověřovací kód klíčové hash zprávy (HMAC - keyed-hash message authentication code) nebo odvození klíče funkce (KDF - key derivation functions). Kryptografické hashovací algoritmy:

  • MD5 (message digest 5)
  • Secure Hash Algorithms (SHA) [7], jako je SHA-256, které generují 256bitovou hashovací hodnotu pro zprávu.

Algoritmy založené na klíčích musí generovat zašifrovaný text, který je prakticky nemožné (nebo alespoň ekonomicky neuskutečnitelné) dešifrovat bez klíče. Hash algoritmy musí generovat hash rychle a stejný pro stejnou vstupní zprávu, ale zřetelně odlišný pro i nepatrnou změnu ve vstupní zprávě. Zároveň nesmí vygenerovat stejný hash pro dvě různé zprávy. Ačkoli se kryptografické algoritmy značně liší, tak všechny jsou provedeny pomocí matematických operací nízké úrovně. Například šifra AES převádí prostý text na šifrový text pomocí několika iterací (rounds), které obsahují jedinečné klíče (rounds keys) odvozené od původního tajného klíče uživatele (Výpis 1).

Cipher(byte in[4*Nb], byte out[4*Nb], word w[Nb*(Nr+1)])
begin
   byte  state[4,Nb]
  state = in
   AddRoundKey(state, w[0, Nb-1])
 
    for round = 1 step 1 to Nr–1
        SubBytes(state)
        ShiftRows(state)
        MixColumns(state)
        AddRoundKey(state, w[round*Nb, (round+1)*Nb-1])
    end for
 
    SubBytes(state)
    ShiftRows(state)
    AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1])
 
    out = state
end

 

Výpis 1: Tento pseudokód popisuje sekvenci operací, které se podílejí na šifrování zpráv. Převádí prostý text (in) na ciphertext (out) pomocí sady hodnot (w) odvozených ze soukromého klíče odesílatele. (Zdroj kódu: NIST)

V rámci jedné iterace transformace SubBytes () se nahradí každý bajt pomocí substituční tabulky (S-box). To samo o sobě je výsledkem řady transformací (obrázek 1).

Obrázek 1: V šifře AES SubBytes () se nahradí každý bajt pomocí substituční tabulky (S-Box). (Zdroj obrázku: NIST)

V dalším kroku transformace ShiftRows () posune bajty v posledních třech řádcích, každý o jiný počet bajtů (obrázek 2).

Obrázek 2: ShiftRows () funkce posune řádky pomocí zvýšením offsetu. (Zdroj obrázku: NIST)

Ke konci sekvence AES se volá funkce MixColumns (), která transformuje každý sloupec tak, že nahradí každý bajt ve sloupci výsledkem polynomu, zatímco AddRoundKey () transformuje výsledek provedením bitové operace XOR v každém sloupci pomocí klíče (round key) vytvořený právě k tomuto účelu.

Celkový počet iterací se liší podle velikosti klíče. AES-128 používá 128bitový klíč, vyžaduje 10 iterací, zatímco AES-192 (velikost klíče 192 bitů) a AES-256 (256 bitů) vyžadují 12 a 14 iterací. Dešifrování se provádí stejným způsobem, akorát v opačném pořadí.

Novější šifry jako je ECDH používané pro výměnu klíčů a ECDSA používané pro digitální podpisy se spoléhají na složitější matematiku, jako jsou algebraické struktury eliptické křivky definované vzorcem:

Rovnice 1

Špatný výběr parametrů křivky může vést k tomu, že křivky budou zranitelné. Aby bylo možné tuto možnost eliminovat, poskytuje NIST standardní sadu kryptograficky robustních křivek P-192, P-224, P-256 a další. Názvy křivek odpovídají délce bitů prvočísla p v základním poli křivky.

Vývojář může tyto vlastnosti použít u ECDSA k podepsání zprávy pomocí dohodnuté křivky a poskytnout příjemci veřejný klíč a podpis - dvojici čísel označených r a s. Skutečný proces podepisování zahrnuje následující kroky:

Začněme s některým bodem na křivce například bodem G (x, y), algoritmus vytvoří veřejný klíč Q (x, y) vynásobením základního bodu soukromým klíčem vývojáře ( d ) modulo p :

Rovnice 2

Další bod (x1, y1 ) je vytvořen pomocí náhodného čísla k v rozsahu [1 ... n -1]:

Rovnice 3

Je generován H (m), hash SHA zprávy m

Pomocí modulo inverze náhodného čísla k , -1 jsou výsledné komponenty r a s digitálního podpisu generovány následovně:

Rovnice 4

Rovnice 5

Konečným výsledkem je výměna, která ověřuje zprávu, potvrzuje její integritu a zajišťuje nepopiratelnost.

Jak implementovat kryptografické algoritmy

Drobná chyba kódování nebo menší chybná interpretace standardu může vést k chybám zabezpečení nebo dokonce k přímému selhání kryptografického procesu. K chybám v implementaci algoritmu může dojít i v největších vývojových organizacích. Například k ní došlo v herní konzoli, protože implementace ECDSA používala konstantní hodnotu k místo náhodné hodnoty pro typ výpočtu znázorněného v rovnici 3. V důsledku toho mohli hackeři odvodit tajný klíč d. Použití vadného náhodného generátoru pro vytvoření k vedlo ke zneužití, které mělo za následek velkou ztrátu bitcoinů.

Hardwarové kryptografické funkce integrované do procesorů a bezpečnostních integrovaných ulehčují vývojářům život, jelikož nemusí znát složité detaily kryptografie. Místo toho se vývojáři mohou zaměřit na využití těchto algoritmů k zabezpečení dané aplikace. Díky hardwarové integraci se přidává další úroveň zabezpečení, jelikož všechny operace se provádí uvnitř procesoru a není možné sledovat sběrnici pro odchytávání procesu kryptografie.

Krypto akcelerátory vykonávají bezpečnostní algoritmy, a tím odlehčují hlavní procesor, který se může věnovat aplikačnímu kódu. Hardwarová podpora šifrování se stává běžnou funkcí procesoru. Ne každá aplikace vyžaduje plnou sílu bezpečnostního prvku. Proto je nutné dbát na správný výběr procesoru nebo bezpečnostního prvku, kde jsou integrovány hardwarové kryptografické funkce.

  • MAX3232 – 32-bitový MCU od Maxim Integrated podporuje šifrování AES a DSA
  • MAX32520 - 32-bit MCU od Maxim Integrated podporuje šfrování AES, SHA a ECDSA
  • 16bitové mikrokontroléry rodiny PIC 24F XLP od Microchip Technology, kde PIC24FJ256GA406 podporuje algoritmy AES a 3DES
  • 32bitové MCU rodiny PIC 32MZ a 32bitové MCU rodiny SAM9X60, kde PIC32MZ2048EFM144 a SAM9X60T podporují šifrování AES a 3DES a také funkce hash SHA a HMAC
  • MCU rodiny SimpleLink od Texas Instruments, mezi které patří bezdrátové MCU CC1312R a CC2652R, které podporují šifrování AES, ECDH a ECDSA a hashovací funkce SHA

Bezpečnostní čipy DS28E38 od Maxim Integrated a ATECC608A od Microchip Technology mají integrovány kryptoakcelerátory a přidružené funkce potřebné k rychlému šifrování ECDSA. V zařízení IoT může procesor používat bezpečnostní čipy k rychlému vytvoření a ověření digitálních podpisů ECDSA P-256.

Bezpečnostní čipy kromě šifrování obsahují také vysoce kvalitní generátory náhodných čísel využívající zdroje náhodných šumů, aby se dosáhla vysoká entropie, která je důležitou vlastností u generátorů TRNG. Tyto druhy generátorů náhodných čísel TRNG jsou nezbytnou součástí pro správnou činnost kryptografických algoritmů.

Procesory s integrovanými kryptografickými akcelerátory pomáhají zjednodušit vývoj díky API knihovnám. Pro zrychlení vývoje lze využít vývojový kit MAX32520-KIT od Maxim Integrated. Tento vývojový kit se dodává s SDK knihovnou Micros, která obsahuje příslušné ovladače, middleware a ukázkové funkce pro šifrování (AES128_ECB_enc ()) a dešifrování (AES128_ECB_dec ()) (Výpis 2).

int AES128_ECB_enc(int asynchronous)
{
    printf( asynchronous ? "Test Cipher Async\n" : "Test Cipher Sync\n");
 
    char *_key = "797f8b3d176dac5b7e34a2d539c4ef36";
    char key[MXC_AES_KEY_128_LEN];
    ascii_to_byte(_key, key, MXC_AES_KEY_128_LEN);
 
    const char *iv_src = "";
    char iv_dst[16];
    ascii_to_byte(iv_src, iv_dst, 16);
 
    char *_pt= "00000000000000000000000000000000";
    char pt[MXC_AES_DATA_LEN];
    ascii_to_byte(_pt, pt, MXC_AES_DATA_LEN);
 
    mxc_ctb_cipher_req_t cipher_req = {
        (uint8_t*)pt,
        MXC_AES_DATA_LEN,
        (uint8_t*)iv_src,
        (uint8_t*)result,
        &Test_Callback };
 
    // Reset crypto block
    MXC_CTB_Init(MXC_CTB_FEATURE_CIPHER | MXC_CTB_FEATURE_DMA);
    MXC_CTB_IntEnable(asynchronous);
 
    MXC_CTB_Cipher_SetMode(MXC_CTB_MODE_ECB);
    MXC_CTB_Cipher_SetCipher(MXC_CTB_CIPHER_AES128);
    MXC_CTB_Cipher_SetKeySource(MXC_CTB_CIPHER_KEY_SOFTWARE);
 
    // Load key into cipher key register
    MXC_CTB_Cipher_SetKey((uint8_t *)key, MXC_AES_KEY_128_LEN);
 
    if (asynchronous){
        wait = 1;
        MXC_CTB_Cipher_EncryptAsync(&cipher_req);
        while( wait );
    } else {
        MXC_CTB_Cipher_Encrypt(&cipher_req);
    }
    const char *_expected = "322FD6E503395CDB89A77AC53D2B954F";
    char expected[MXC_AES_DATA_LEN];
    ascii_to_byte(_expected, expected, MXC_AES_DATA_LEN);
 
    return AES_check(result, expected, MXC_AES_DATA_LEN);
}
 
int AES128_ECB_dec(int asynchronous)
{
    printf( asynchronous ? "Test Cipher Async\n" : "Test Cipher Sync\n");
 
    char *_key = "797f8b3d176dac5b7e34a2d539c4ef36";
    char key[MXC_AES_KEY_128_LEN];
    ascii_to_byte(_key, key, MXC_AES_KEY_128_LEN);
 
    const char *iv_src = "";
    char iv_dst[16];
    ascii_to_byte(iv_src, iv_dst, 16);
 
    char *_pt= "322FD6E503395CDB89A77AC53D2B954F";
    char pt[MXC_AES_DATA_LEN];
    ascii_to_byte(_pt, pt, MXC_AES_DATA_LEN);
 
    mxc_ctb_cipher_req_t cipher_req = {
        (uint8_t*)pt,
        MXC_AES_DATA_LEN,
        (uint8_t*)iv_src,
        (uint8_t*)result,
        &Test_Callback };
 
    // Reset crypto block
    MXC_CTB_Init(MXC_CTB_FEATURE_CIPHER | MXC_CTB_FEATURE_DMA);
    MXC_CTB_IntEnable(asynchronous);
 
 
    MXC_CTB_Cipher_SetMode(MXC_CTB_MODE_ECB);
    MXC_CTB_Cipher_SetCipher(MXC_CTB_CIPHER_AES128);
    MXC_CTB_Cipher_SetKeySource(MXC_CTB_CIPHER_KEY_SOFTWARE);
 
    // Load key into cipher key register
    MXC_CTB_Cipher_SetKey((uint8_t *)key, MXC_AES_KEY_128_LEN);
 
    if (asynchronous){
        wait = 1;
        MXC_CTB_Cipher_DecryptAsync(&cipher_req);
        while( wait );
    } else {
        MXC_CTB_Cipher_Decrypt(&cipher_req);
    }
    const char *_expected = "00000000000000000000000000000000";
    char expected[MXC_AES_DATA_LEN];
    ascii_to_byte(_expected, expected, MXC_AES_DATA_LEN);
 
    return AES_check(result, expected, MXC_AES_DATA_LEN);
}

Výpis 2: Ukázkový kód v distribučním balíčku Maxim Integrated Micros SDK pro šifrování AES (AES128_ECB_enc ()) a dešifrování (AES128_ECB_dec ()) pomocí integrovaných kryptografických funkcí MAX32520 MCU. (Zdroj kódu: Maxim Integrated)

Ověřovací protokoly

Protokoly vyšší úrovně, jako je například Transport Layer Security (TLS) obvykle provádějí své operace pomocí definované sady kryptografických algoritmů, které se nazývají sada šifer. TLS pomáhá zajistit autentizaci a důvěrnost v komunikaci mezi embeded zařízením a hostitelským serverem. TLS 1.2 [8] nejdříve provede několik bezpečnostních úkonů (vyjednávání parametrů, autentizaci a výměnu klíčů) než dojde k výměně dat (obrázek 3).

Obrázek 3: Protokol vytváření relace TLS 1.2 používá různé algoritmy pro ověřování, výměnu klíčů a výměnu dat. (Zdroj obrázku: Texas Instruments)

Ověřování je zajištěno stanovením identity serveru (a případně klienta) ověřením bezpečnostních certifikátů, které obsahují příslušný veřejný klíč pro každého účastníka. Každý účastník odešle zprávu zašifrovanou svým soukromým klíčem. Protože přijatý veřejný klíč může dešifrovat pouze zprávu zašifrovanou přidruženým soukromým klíčem, každý účastník může potvrdit, že poskytovatel certifikátu tento certifikát skutečně vlastní.

V další fázi TLS provedou účastníci řadu transakcí za účelem vytvoření sdíleného klíče relace. Tento sdílený klíč relace se potom používá k šifrování skutečného přenosu zpráv a zajišťuje důvěrnost výměn zpráv pro danou relaci. V průběhu procesu výměny parametrů mohou vývojáři použít jinou sadu šifer podporovaných TLS 1.2 pro každou fázi protokolu:

  • Stanovení klíče: RSA, DH, ECDH
  • Ověřování: RSA, DSA, ECDSA
  • Šifry: 3DES, AES
  • Ověřování zpráv: SHA

Nejnovější verze TLS 1.3 [9] přidává další zabezpečení tím, že nejprve provádí výměnu klíčů, aby lépe chránila proces vytváření relace.

Zjednodušeně řečeno, TLS 1.3 z velké části disponuje sadou šifer TLS 1.2 a navíc funkce HMAC Key Derivation Function (HKDF) a autentizované šifrování s přidruženými datovými algoritmy (AEAD - authenticated encryption with associated data). Algoritmy AEAD zajišťují autentičnost zprávy, integritu a důvěrnost. Tyto algoritmy lze kombinovat s šifrováním MAC sériově (obrázek 4, vlevo), paralelně (obrázek 4, vpravo).

Obrázek 4: AEAD poskytuje autentizaci a důvěrnost zahrnutím MAC do šifrového textu, mimo jiné pomocí metod nazývaných encrypt-then-MAC (vlevo) a encrypt-and-MAC (vpravo), které vypočítávají MAC v sérii nebo paralelně, resp. (Zdroj obrázku: Wikipedia)

Zvýšení bezpečnosti

Vývoj kryptografických algoritmů a přidružených protokolů je neustálý boj mezi odborníky na kryptografii, kteří chtějí chránit data a těmi odborníky, kteří chtějí data ukrást. V kryptografii je úroveň bezpečnosti algoritmu definována jako x bitů a očekávání, že útok bude vyžadovat asi 2x operací k odvození soukromého klíče. Různé třídy algoritmů mohou vyžadovat výrazně odlišné délky klíčů pro dosažení srovnatelné úrovně bezpečnosti (tabulka 1).

Tabulka 1: Různé třídy kryptografických algoritmů mohou vyžadovat výrazně odlišné velikosti klíčů pro veřejné klíče (L) nebo soukromé klíče (N, k, f), aby bylo dosaženo srovnatelné úrovně síly zabezpečení. (Zdroj obrázku: NIST)

V této tabulce od NIST odpovídají parametry algoritmu FFC L a N velikostem veřejného klíče a soukromého klíče. U algoritmů IFC a ECC odpovídají k a f velikosti klíče. NIST poznamenává, že algoritmy s bezpečnostní silou 80 GBP (oranžové pozadí v tabulce) již nejsou schváleny pro vládní ochranu informací, zatímco ostatní (žluté pozadí) ještě nejsou zahrnuty do standardů NIST kvůli problémům s efektivitou.

Komerční národní bezpečnostní agentura USA (NSA) Suite National Security Algorithm (CNSA) Suite nahradila dřívější sadu NSA B s doporučeními pro použití robustnějších parametrů potřebných k ochraně informací klasifikovaných jako přísně tajné (tabulka 2).

Tabulka 2: CNSA obsahuje kryptografické algoritmy s doporučeními pro minimální úrovně zabezpečení potřebné k ochraně vysoce citlivých informací. (Zdroj obrázku: Digi-Key, z dat NSA)

Závěr

Zařízení IoT čelí rostoucímu počtu hrozeb, které vyžadují stále robustnější metody zabezpečení založené na široké škále kryptografických algoritmů. Jak je ukázáno, je možné použít hardwarové implementace těchto algoritmů, které vývojářům umožní snadněji integrovat silné zabezpečení, aniž by tím byly ohroženy primární požadavky na funkčnost a výkon dané aplikace.

Odkazy:

 

Článek vyšel v originále na webu DigiKey.com, autorem je Stephen Evanczuk.

Hodnocení článku: